0

在 java 中,我创建了一个具有全局范围的对象。

在某些时候,我在另一个线程中,需要知道全局对象当前是否被任何线程锁定。

  • 克里希纳
4

2 回答 2

2

在普通对象上使用 synchronized 关键字是不可能的。

您需要一个“锁定”对象,也许是一个实现java.lang.concurrent.locks.Lock的对象,它提供了 tryLock() 方法或类似方法。

这允许您的线程尝试获取锁,如果锁当前未锁定在其他地方,则返回 true。

当然,在这种情况下,您可能需要立即解锁锁 - 否则您的线程将阻止其他线程继续进行。

于 2011-09-29T11:53:36.717 回答
0

这里的大问题是定义“当前”。

我能建议的最好的方法是尝试以零超时获取锁。如果您获得了锁,则可以确定全局对象已被您的“不同线程”锁定。如果不是,则该对象可能已被其他线程锁定或未锁定,很可能是,但是当您失败的锁定尝试返回时,锁定可能已被释放。如果在锁定尝试期间将“不同线程”的优先级提高到最高可能,您应该能够获得更可靠的结果。

如果这个测试是为了一些临时的调试、优化或统计目的,那很好,但你不应该使用这样的东西来实现可交付的功能。

Rgds,马丁

于 2011-09-29T11:46:43.013 回答