这是从Joshua Bloch编写的一本书中摘取的。如果线程试图获取它已经拥有的锁,会发生什么情况?
我不是英语母语的人,因此有理由要求澄清疑问。
由于内在锁是可重入的,如果一个线程试图 收购它已经持有锁,请求 成功。重入意味着每个线程在 而非**每个调用的基础上获取锁。
通过每个调用的基础,他意味着每个方法调用? 考虑片段:
class Factoriser{
public synchronized void doSomething(){
// code goes here
}
}
假设有一个线程A,并且能够在具有实例方法doSomething的对象获取锁()。由于某种原因,相同的线程线程A再次获得对同一个对象实例方法doSomething()的锁(想象前一个锁还没有被释放)。
如果我正确理解了Joshua的说法,那么即使有2个方法调用/调用,也只会有一个锁。我的理解是否100%正确。请举例说明。我很困惑,因为提交人在下面的段落中澄清了这一点,这使我更加困惑。
重入是通过将每个锁与一个采集计数和一个拥有线程相关联来实现的。当计数为零时,该锁被认为是不受支持的。当线程获取先前未释放的锁定时,JVM将记录所有者 并将采集计数设置为1。如果同一个线程 再次获取锁定,则计数递增,并且当拥有线程退出同步块时,计数递减 。当计数达到零时,锁定被释放。
如果重入/锁获取不是基于每个调用的基础,那么为什么JVM将对上述场景设置为2来完成计数?
这是一个** ** ** ** ** **。事实上,**有如此多的大胆**,它变得毫无意义**和**分心**。 – Andreas
每个对象只有一个锁。任何数量的调用只需要相同的锁(成功)。当最后一个锁被释放时,该对象不再被锁定。为什么这很难? – markspace
@Andreas:谢谢。删除。 –