ReentrantLock是基于AQS实现的,所以在之前必须先看看AQS解析这篇文章https://blog.csdn.net/zgsxhdzxl/article/details/95032337,或者这篇https://www.cnblogs.com/java-zhao/p/5131544.html也是写的很详细很好的。
ReentrantLock是独占锁,实现了Lock接口,支持公平锁和非公平锁。公平锁和非公平锁概念看
主要方法
- lock
加锁。
//内部类NonfairSync非公平锁
final void lock() {
// 设置state为1,成功则设置当前线程为拥有锁线程
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1); // 失败则加入队列等等,后续详看AQS解析那篇
}
非公平锁
- tryLock
尝试获取锁,可以设置超时获取,代码解析见AQS解析那篇。
- unlock
释放锁。代码解析见AQS解析那篇。
- lockInterruptibly
中断获取锁的线程。lockInterruptibly和lock最主要的区别在于它获取锁失败后会中断当前线程
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null; // help GC
failed = false;
return;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
// 与lock最主要的区别就在这里,如果线程被中断,那么就直接抛出异常
throw new InterruptedException();
}