Java线程内部

Java线程内部,java,multithreading,locking,semaphore,synchronized,Java,Multithreading,Locking,Semaphore,Synchronized,我研究Java的内部结构已经有相当一段时间了。我很想学习和理解Java中线程/锁定是如何发生的 因此,为了访问同步方法或同步块,线程必须首先获取对象上的锁。所以,现在,这里是我需要的多一点光 因此,每当线程获取对象上的锁时,它是否会在内部增加信号量的值? 如果答案是肯定的,那么让我们来看看这个场景。 class ABC{ public void method_1(){ synchronized(xyz){ .... }

我研究Java的内部结构已经有相当一段时间了。我很想学习和理解Java中线程/锁定是如何发生的

因此,为了访问同步方法或同步块,线程必须首先获取对象上的锁。所以,现在,这里是我需要的多一点光

因此,每当线程获取对象上的锁时,它是否会在内部增加信号量的值? 如果答案是肯定的,那么让我们来看看这个场景。

class ABC{ 

    public void method_1(){
        synchronized(xyz){
            ....
        }
    }

    public void method_2(){
        ...
        synchronized(xyz){
            ....
        }
    }
}
假设有两个线程:线程1和线程2。假设,Thread1首先进入了方法_1,因此首先获得了xyz上的锁。现在,假设,Thread2进入方法2并尝试获取xyz上的锁。会发生什么? (根据我的说法,Thread2将被阻止,因为它发现对象的信号量值>0)

让我知道我的推理是否正确

每当线程获取对象上的锁时,它是否会在内部增加信号量的值

特定于实现,但不太可能,因为每个锁只能获得一次,所以不需要计数器。一个简单的切换就可以了。我假设每个锁都包含一个对拥有它的线程的引用(或null)

更新:事实上,它比这要复杂得多。锁还需要维护等待它的线程列表。此外,线程可以通过wait/notify机制临时释放锁(因此毕竟会有一个入口计数器)。最重要的是,锁管理对性能有很大的影响,因此有各种各样的优化。我是在研究JVM锁定的人那里发现的

假设有两个线程:线程1和线程2。假设Thread1首先进入了方法_1,因此首先获得了xyz上的锁。现在,假设Thread2进入方法_2并尝试获取xyz上的锁。会发生什么


是的,线程2将被阻塞,并等待它最终获得锁。

您的推理大致正确。线程2将被阻止,并将保持阻止状态,直到(至少)线程1释放互斥锁

但是,锁通常不使用带有简单计数器的传统信号量来实现。通常,只有当对象以重入方式锁定时(例如,当Thread1试图锁定
xyz
而它已经持有该对象的锁时),或者当存在对锁的争用时(例如,当Thread2试图锁定
xyz
而Thread1将其锁定时),才有一个锁位“膨胀”为完全锁定


但是您不需要关心Java锁的实现细节。。。除非您自己实现JVM

其他答案基本上回答了你的问题,但为了进一步阅读,我建议:

是的。问题是什么?你基本上是在重复关于锁如何工作的定义。是的,你的描述在一般层面上是正确的。关于那个描述,你有什么不明白的地方吗?