我研究 Java 的内部结构已经有一段时间了。我很想学习和理解线程/锁定在 Java 中是如何发生的。
因此,为了访问同步方法或同步块(synchronized block),线程必须首先获取对象上的锁。所以,现在,我需要更多的光线。
那么,每当线程获取对象的锁时,它是否会在内部增加信号量的值? 如果答案是肯定的,那么让我们来看看这个场景。
class ABC{
public void method_1(){
synchronized(xyz){
....
}
}
public void method_2(){
...
synchronized(xyz){
....
}
}
}
假设有两个线程:线程 1 和线程 2。假设,线程 1 首先进入 method_1,因此首先获得了对 xyz 的锁定。并且,现在说,Thread2 进入 method_2 并尝试获取对 xyz 的锁定。会发生什么? (据我所知,Thread2 会被阻塞,因为它发现对象的信号量值>0)
让我知道我的推理是否正确。
最佳答案
whenever the thread acquires the lock on the object, does it increment the value of the semaphore internally?
特定于实现,但不太可能,因为每个锁只能获得一次,因此不需要计数器。一个简单的切换就可以了。我假设每个锁都持有对拥有它的线程的引用(或 null)。
更新:实际上,它比这要复杂得多。锁还需要维护一个等待它的线程列表。此外,线程可以通过等待/通知机制临时释放锁(所以毕竟会有一个入口计数器)。最重要的是,锁管理对性能有很大影响,因此正在进行各种优化。我找到了这个 interesting blog由从事 JVM 锁定工作的人编写。
So, say there are two threads: Threaad 1 and Thread 2. Assuming, Thread1 entered method_1 first and therefore acquired a lock on xyz first. And, say now, Thread2 enters method_2 and tries to acquire lock on xyz. What will happen?
是的,线程2会被阻塞,一直等到它最终能拿到锁。
关于Java线程内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2305033/