多线程可重入锁的原理实现
可重入锁
锁作为并发共享数据保证一致性的工具,大多数内置锁都是可重入的,也就是说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器将会递减,当计数值等于0时,锁释放。如果没有可重入锁的支持,在第二次企图获得锁时将会进入死锁状态。
可重入锁随处可见,如synchronized 和ReentrantLock。
原理实现
手动实现一个可重入锁,代码如下:
package com.msl.others;
import java.util.concurrent.locks.ReentrantLock;
/**
* 可重入锁: 锁可以延续使用 + 计数器
*
* @author Senley
*
*/
public class LockTest {
ReentrantLock lock = new ReentrantLock();
public void a() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
doSomething();
lock.unlock();
System.out.println(lock.getHoldCount());
}
//不可重入
public void doSomething() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
//...................
lock.unlock();
System.out.println(lock.getHoldCount());
}
public static void main(String[] args) throws InterruptedException {
LockTest04 test = new LockTest04();
test.a();
Thread.sleep(1000);
System.out.println(test.lock.getHoldCount());
}
}
结果如下:
1
2
1
0
0