JAVA中的内部锁及Reentrancy(可重入)特性

JAVA提供了强制原子性的内部锁机制,也就是我们常用的synchronized块,主要包含两个部分:锁对象的引用和由这锁保护的代码块。synchronized方法的锁就是该方法所在的对象本身,如果是静态方法,则锁为此方法所在类的Class对象。

synchronized(lock){

   //代码块

}

 

内部锁在JAVA中主要是扮演互斥锁的角色(mutex),也就是说最多只能有一个线程拥有这个锁,拥有这个锁的线程将处于就绪队列中等待JVM的调用,而其他需要此锁的请求线程将被阻塞。

 

内部锁的一个特点就是其具有Reentrancy特点,也就是可重入。这意味着锁的请求是基于“每线程”的,而不是基于“每调用”,每个锁会关联一个请求记数和一个占有它的线程,当请求记数为0时,说明这个锁未被任何线程占有;当有线程请求此锁时,JVM会将请求记数+1,同时记录锁的占有线程,如果同一线程再次请求这个锁,则请求记数继续+1递增,每次占用线程退出一个同步块,记数值将-1,直到记数为0时,锁也就被释放了。

 

Reentrancy特点方便了面向对象的开发,例如由synchronized保护的子类方法中需要调用父类中也由synchronized保护的方法(两个方法都需要请求父类对象的锁),又或者是同一个类中synchronized方法间的相互调用(都需要请求此对象的锁),由于都是同一线程并且是请求相同的锁,并且Reentrancy保证了锁的请求基于“每线程”,因此可以进行方便的调用,而不用担心死锁问题。

你可能感兴趣的:(并发)