我对普通的 java 线程理论有疑问。
线程 A 锁定了某个对象,比如说 xObj。现在线程 B 如何知道线程 A 已经锁定了对象 xObj。
这是如何在 java 中实现的。
提前致谢。
感谢您的回答....在这里我想澄清一下...我不必实现这个。我关心的是Java是如何实现的。线程B如何知道有人已经锁定在 Object.May 是 Object 类或其他一些类已经实现了这一点。
我对普通的 java 线程理论有疑问。
线程 A 锁定了某个对象,比如说 xObj。现在线程 B 如何知道线程 A 已经锁定了对象 xObj。
这是如何在 java 中实现的。
提前致谢。
感谢您的回答....在这里我想澄清一下...我不必实现这个。我关心的是Java是如何实现的。线程B如何知道有人已经锁定在 Object.May 是 Object 类或其他一些类已经实现了这一点。
线程 A 锁定了某个对象,比如说 xObj。现在线程 B 如何知道线程 A 已经锁定了对象 xObj。
这取决于您正在谈论的锁类型。
对于原始互斥体,一个线程无法测试另一个线程是否持有互斥体,更不用说找出它是哪个线程了。(它可以测试是否持有锁......)
该Lock
接口同样不支持这一点。
该类ReentrantLock
确实提供了一种方法来找出这一点:请参阅ReentrantLock.getOwner()
. 但是请注意,这是一种方法,因此如果您想让该方法普遍可用protected
,您需要创建一个子类。ReentrantLock
我也会质疑这种方法的价值。它只能告诉您在调用时哪个(如果有)线程拥有锁。片刻之后,主人可能已经改变了。
相比之下,Thread.holdsLock()
为您提供可以依赖的信息……尽管这些信息在大多数情况下没有用处。
您有以下选择
但是B不需要知道A有锁,一旦锁被释放,如果没有任何线程在等待它,B就可以使用它。
你说的是哪个锁?例如,如果它是ReentrantLock,你可以调用
lock.getOwner()
编辑:
synchronized(xObj) { }
不是您所暗示的锁。它在概念上更接近于监视器锁。您使用同步块的功能有限,这正是存在 ReentrantLock 之类的类的原因。来自 doc
一种可重入互斥锁,其基本行为和语义与使用同步方法和语句访问的隐式监视器锁相同,但具有扩展功能。
-当一个线程获得lock
一个对象的时候,那么所有的synchronized
方法都只能通过那个线程访问,并且没有一个,直到它离开锁。
-如果Thread A
拥有lock
一个对象并Thread B
尝试访问同一对象上的锁,则can't access
它。由于锁在 A 上,它对线程 B 来说并不重要,锁与谁在一起,但锁是否可用。如果不是,线程 B 进入阻塞状态,直到线程 A 释放锁。