1

我对普通的 java 线程理论有疑问。

线程 A 锁定了某个对象,比如说 xObj。现在线程 B 如何知道线程 A 已经锁定了对象 xObj。

这是如何在 java 中实现的。

提前致谢。

感谢您的回答....在这里我想澄清一下...我不必实现这个。我关心的是Java是如何实现的。线程B如何知道有人已经锁定在 Object.May 是 Object 类或其他一些类已经实现了这一点。

4

4 回答 4

1

线程 A 锁定了某个对象,比如说 xObj。现在线程 B 如何知道线程 A 已经锁定了对象 xObj。

这取决于您正在谈论的锁类型。

  • 对于原始互斥体,一个线程无法测试另一个线程是否持有互斥体,更不用说找出它是哪个线程了。(它可以测试是否持有锁......)

  • Lock接口同样不支持这一点。

  • 该类ReentrantLock确实提供了一种方法来找出这一点:请参阅ReentrantLock.getOwner(). 但是请注意,这是一种方法,因此如果您想让该方法普遍可用protected,您需要创建一个子类。ReentrantLock


我也会质疑这种方法的价值。它只能告诉您在调用时哪个(如果有)线程拥有锁。片刻之后,主人可能已经改变了。

相比之下,Thread.holdsLock()为您提供可以依赖的信息……尽管这些信息在大多数情况下没有用处。

于 2012-10-11T10:02:59.397 回答
1

您有以下选择

  1. Thread.holdsLock(Object object)在这种情况下,您将需要 A 中 B 的线程实例。
  2. ReentrantLock.getOwner() , ReentrantLock.hasQueuedThread(Thread 线程)

但是B不需要知道A有锁,一旦锁被释放,如果没有任何线程在等待它,B就可以使用它。

于 2012-10-11T10:05:17.907 回答
0

你说的是哪个锁?例如,如果它是ReentrantLock,你可以调用

 lock.getOwner()

编辑:

synchronized(xObj) { } 

不是您所暗示的锁。它在概念上更接近于监视器锁。您使用同步块的功能有限,这正是存在 ReentrantLock 之类的类的原因。来自 doc

一种可重入互斥锁,其基本行为和语义与使用同步方法和语句访问的隐式监视器锁相同,但具有扩展功能。

于 2012-10-11T09:55:25.733 回答
0

-当一个线程获得lock一个对象的时候,那么所有的synchronized方法都只能通过那个线程访问,并且没有一个,直到它离开锁。

-如果Thread A拥有lock一个对象并Thread B尝试访问同一对象上的锁,则can't access它。由于锁在 A 上,它对线程 B 来说并不重要,锁与谁在一起,但锁是否可用。如果不是,线程 B 进入阻塞状态,直到线程 A 释放锁。

于 2012-10-11T10:01:07.863 回答