ReentrantLock 可重入锁的使用及原理
一. ReentrantLock 的介绍
可重入锁,顾名思义,就是一个线程可对资源重复加锁。而且在锁的具体实现中,有一个对队列同步器的自定义同步器 Sync,同步器主要是对加锁和解锁做具体的实现。其中可重入锁的构造函数中有一个参数用来区分公平锁还是非公平锁,公平锁的具体策略就是哪个线程等待的时间最长,那就哪个线程先获取锁,非公平锁则不能保证这个公平策略。
虽然说公平锁能保证时间长的线程会先获取到锁,但是为了维护这个公平策略,公平锁的效率就没有非公平锁的高,所以如果想要比较高的效率,使用非公平锁是一种很好地选择。
二. ReentrantLock 的使用
ReentrantLock 的使用比较简单,和 synchronized 的使用很相像,唯一的区别就是 ReentrantLock 需要显示地加锁和解锁而 synchronized 是隐式地,为了避免有的锁没有释放,一般都是在 finally 中使用 unlock()
将锁释放。
public class ReentrantLockTest {
private static final ReentrantLock lock = new ReentrantLock();
private int num = 0;
public int getNum() {
return num;
}
private void count() {
lock.lock();
try {
for (int i = 0; i < 100000; i++) {
num+=1;
}
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ReentrantLockTest lockTest = new ReentrantLockTest();
Thread thread1 = new Thread(() -> {
lockTest.count();
});
Thread thread2 = new Thread(() -> {
lockTest.count();
});
thread1.start();
thread2.start();
try