- 锁争用
当一个线程请求其他线程已经占有的锁时,请求线程将被阻塞。synchronized是reentrancy lock ,当线程在试图获得它自己占有的锁时,请求会成功。
- 可重入性
reentrancy 可重入意味着在请求锁时是基于“每线程(per-thread)”,而不是基于“每调用(per-invocation)”。
public class ReentrancyDemo{
public synchronized void test1(){
//.....业务代码
test2(); //方法test2可执行,如果synchronized 不可重入,会产生死锁
}
public synchronized void test2(){
//...业务代码
}
}
- 重入性实现原理
reentrancy 的实现是通过为每个锁关联一个请求计数器(acquisition count)和一个占有它的线程。计数器为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,JVM将记录锁的占有者(占有线程),并将请求计数设置为1。如果同一线程再次请求这个锁,计数将递增;每次占用线程退出同步块,计数器值将递减,直到计数器达到0时,锁被释放。
网友评论