synchronized 关键字是否实现了一种重入锁?请解释其实现原理。
Synchronized
确实是一种重入锁。重入锁,顾名思义,就是一个线程可以多次获得同一把锁。在Java中,synchronized关键字提供的锁就是重入锁。
synchronized的重入性是由JVM通过对象监视器(monitor)实现的。每个对象都有一个与之关联的monitor。当线程获取对象的锁时,monitor的计数器会加1,当线程释放锁时,计数器会减1。当计数器为0时,其他线程就可以获取这个对象的锁。
当一个线程已经拥有了对象的锁,再次请求该对象的锁时,由于JVM可以识别出锁的拥有者,所以这个线程可以再次获取到锁,而无需等待锁被释放。这就是synchronized的重入性。
举个例子,比如有一个类有两个synchronized方法,method1和method2。如果一个线程已经进入了method1,那么这个线程可以直接进入method2,而无需等待method1的锁被释放。这就是因为synchronized是重入锁,同一线程可以多次获取同一把锁。
public class Example {
public synchronized void method1() {
// do something
method2();
}
public synchronized void method2() {
// do something
}
}
这种锁的设计避免了线程自我死锁,也就是一个线程在等待自己释放的锁。这种情况在没有重入锁的情况下是可能发生的。