2012-10-11 32 views
1

我有一个正常的java线程理论的问题。Java线程模型

线程A已经采取了一些锁定对象上,让说xObj。现在线程B如何知道线程A已经对对象xObj进行了锁定。

如何这已经在Java中实现。

在此先感谢。

谢谢您的回答....在这里我想明确的是......我没有实现this.My关心的是如何Java已经实现that.How线程B将结识某人有已经对Object.May是Object类或其他类已经实现了这个锁。

+0

通过'采取锁'你的意思是'捕获监测对象'?如果是的话,你的问题的答案可能只能在JVM的本地代码中找到。 – CAMOBAP

+0

synchronized(xObj){-----------------------}线程A已经锁定了xObj.If线程B出现了,它将如何知道线程A已经取得了锁,线程B将等待线程A释放xObj上的锁。 – VJS

+0

下面有很好的答案,但请注意,这种信息永远不可靠:其他线程可能已经释放了监视器,而其他某个线程甚至可能已经重新捕获了它,在获得结果并将其用于任何事情之间。它可能在调试死锁和类似的东西时很有用。 – hyde

回答

1

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

这取决于那种你正在谈论锁。

  • 对于原始的互斥体,一个线程不能测试,如果另一个线程持有互斥体,更不用说找出它是哪个线程。 (它可以测试但是如果持有锁...)

  • Lock接口同样不支持此。

  • ReentrantLock确实提供发现这一点的方法:看ReentrantLock.getOwner()。但请注意,这是一种protected方法,因此如果您想使方法通常可用,则需要创建ReentrantLock的子类。


我也怀疑这种方法的价值。它只能告诉你哪个(如果有的话)线程在进行呼叫时拥有该锁。过了一会儿,主人可能已经改变了。

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

0

哪个锁你在说什么?如果是实例ReentrantLock,你可以叫

lock.getOwner() 

编辑:

synchronized(xObj) { } 

是不是锁定为你暗示。它在概念上更接近于monitor lock。你只有有限的使用synchronized块功能 ,这也正是为什么类,如ReentrantLock的exists.From的文档

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

+0

synchronized(xObj) { ----------------------- \t \t \t }线程A锁定了xObj.If线程B来了,它将如何知道线程A已经取得锁定,线程B将等待线程A释放xObj上的锁定。 – VJS

0

-当一个线程获取对象的lock,那么所有的​​方法只能通过该线程并没有访问,直到它离开锁。

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

+0

线程B如何知道某个人(你是对的,对B不重要,锁与谁在一起)已经锁定了。这是我的问题。 – VJS

+0

@VJS,很好,你正在使用ReentrantLock然后你可以尝试这个ReentrantLock.getOwner()。 –