Java线程模型

Java线程模型,java,jakarta-ee,thread-safety,Java,Jakarta Ee,Thread Safety,我有一个关于普通java线程理论的问题 线程A已经锁定了某个对象,比如说xObj。现在线程B如何知道线程A已经锁定了对象xObj 这是如何在java中实现的 提前谢谢 谢谢你的回答……这里我想澄清一下……我不必实现这个。我关心的是Java是如何实现的。线程B如何知道有人已经锁定了对象。可能是对象类或其他类实现了这个。你说的是哪个锁?如果是一个例子,你可以打电话 lock.getOwner() 编辑: 不是你所暗示的锁。从概念上讲,它更接近于一个标准。您的功能有限 使用同步块,这就是像Reen

我有一个关于普通java线程理论的问题

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

这是如何在java中实现的

提前谢谢


谢谢你的回答……这里我想澄清一下……我不必实现这个。我关心的是Java是如何实现的。线程B如何知道有人已经锁定了对象。可能是对象类或其他类实现了这个。你说的是哪个锁?如果是一个例子,你可以打电话

 lock.getOwner()
编辑:

不是你所暗示的锁。从概念上讲,它更接近于一个标准。您的功能有限 使用同步块,这就是像ReentrantLock这样的类存在的原因

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


-当一个线程获得对象的
锁时,所有
同步的
方法只能通过该线程访问,无,直到它离开锁为止

-如果
线程A
具有对象的
,并且
线程B
尝试访问同一对象上的锁
,则
无法访问它。由于锁与A一起使用,对于线程B来说并不重要,该锁与谁一起使用,但锁是否可用。如果没有,线程B将进入阻塞状态,直到线程A释放锁为止

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

这取决于你所说的锁的类型

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

  • Lock
    接口同样不支持此操作

  • ReentrantLock
    类确实提供了一种方法来找出这个问题:请参见
    ReentrantLock.getOwner()
    。但是请注意,这是一个受保护的
    方法,因此,如果要使该方法普遍可用,则需要创建
    ReentrantLock
    的子类


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

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

您有以下选项

  • 在这种情况下,您将需要A中B的线程实例
  • ,
  • 但是没有必要让B知道A有锁,一旦锁被释放,如果没有任何线程等待它,它就可以供B使用


    通过
    获取锁
    您的意思是
    捕获对象的监视器
    ?如果是,您的问题的答案可能仅在JVM的本机代码中找到。synchronized(xObj){-------------------}线程A已锁定xObj。如果线程B出现,它将如何知道线程A已锁定,线程B将等待线程A释放xObj.synchronized(xObj)上的锁{-------------------}线程A已经锁定了xObj。如果线程B来了,它将如何知道线程A已经锁定,而线程B将等待线程A释放xObj上的锁定。线程B如何知道某人(你是对的,对B不重要,该锁定与谁在一起)已经被锁定。这是我的问题。@VJS,如果您使用的是ReentrantLock,那么您可以尝试这个ReentrantLock.getOwner()。
    synchronized(xObj) { }