在java中,我创建了一个具有全局范围的对象。
在某些时候,我处于不同的线程,需要知道全局对象当前是否被任何线程锁定。
答案 0 :(得分:2)
在普通对象上使用synchronized关键字是不可能的。
你需要一个“锁定”对象,也许是一个实现java.lang.concurrent.locks.Lock的对象,它提供了一个tryLock()方法或者类似方法。
这允许您的线程尝试获取锁定,如果Lock当前未在其他位置锁定,则返回true。
当然,在这种情况下,您可能需要立即解锁 - 否则您的线程将阻止其他线程取得进展。
答案 1 :(得分:0)
这里最大的问题是定义'当前'。
我能建议的最好的方法是尝试以零超时获取锁定。如果你得到了锁,你可以确定全局对象被锁定 - 通过你的“不同线程”。如果没有,对象可能被其他线程锁定或不被锁定,可能是这样,但是在失败的锁定尝试返回时锁定可能已被释放。如果在锁定尝试期间将“不同线程”的优先级提高到最高可能,您应该能够获得更可靠的结果。
如果这个测试用于某些临时调试,优化或统计目的那么很好,但你不应该使用这样的东西来实现可交付的功能。
RGDS, 马丁