Java线程模型

时间:2012-10-11 09:52:42

标签: java java-ee thread-safety

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

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

如何在java中实现。

提前致谢。

感谢您的回答....在这里,我想清楚一点......我没有必要实现这一点。我关心的是Java如何实现。如何线程B将会知道某人已经对Object.May进行锁定是Object类或其他一些类实现了这个。

4 个答案:

答案 0 :(得分:1)

  

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

这取决于你所谈论的锁类型。

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

  • Lock界面同样不支持此功能。

  • ReentrantLock 提供了一种方法来查找它:请参阅ReentrantLock.getOwner()。但请注意,这是一个protected方法,因此如果您希望方法一般可用,则需要创建ReentrantLock的子类。


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

通过对比,Thread.holdsLock()为您提供了您可以依赖的信息......尽管在大多数情况下这些信息都是无用的。

答案 1 :(得分:1)

您有以下选项

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

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

答案 2 :(得分:0)

你在谈论哪个锁?例如,如果它是ReentrantLock,您只需拨打

即可
 lock.getOwner()

编辑:

synchronized(xObj) { } 

不是你所暗示的锁定。它在概念上更接近monitor lock。您的功能有限 使用synchronized块,这正是ReentrantLock这样的类存在的原因。来自doc

  

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

答案 3 :(得分:0)

- 当一个帖子获得一个对象的lock时,所有synchronized方法只能通过该线程访问 ,直到它离开锁。

- 如果Thread A包含对象的lockThread B尝试访问同一对象上的锁定,它can't access它。由于锁是A,对于线程B不重要,该锁与谁一起,但是可用锁。如果不是线程B进入阻塞状态,直到线程A释放锁定。