ReentrantLock是如何实现可重入性

简介: ReentrantLock是如何实现可重入性

1 问题

ReentrantLock是如何实现可重入性的?并且在进入锁内之前进行了哪些判断?


2 方法

// Sync继承于AQS
abstract static class Sync extends AbstractQueuedSynchronizer {
...
}
// ReentrantLock默认是非公平锁
public ReentrantLock() {
       sync = new NonfairSync();
}
// 可以通过向构造方法中传true来实现公平锁
public ReentrantLock(boolean fair) {
   sync = fair ? new FairSync() : new NonfairSync();
}
protected final boolean tryAcquire(int acquires) {
       // 当前想要获取锁的线程
       final Thread current = Thread.currentThread();
       // 当前锁的状态
       int c = getState();
       // state == 0 此时此刻没有线程持有锁
       if (c == 0) {
           // 虽然此时此刻锁是可以用的,但是这是公平锁,既然是公平,就得讲究先来后到,
           // 看看有没有别人在队列中等了半天了
           if (!hasQueuedPredecessors() &&
               // 如果没有线程在等待,那就用CAS尝试一下,成功了就获取到锁了,
               // 不成功的话,只能说明一个问题,就在刚刚几乎同一时刻有个线程抢先了 =_=
               // 因为刚刚还没人的,我判断过了
               compareAndSetState(0, acquires)) {
               // 到这里就是获取到锁了,标记一下,告诉大家,现在是我占用了锁
               setExclusiveOwnerThread(current);
               return true;
           }
       }
         // 会进入这个else if分支,说明是重入了,需要操作:state=state+1
       // 这里不存在并发问题
       else if (current == getExclusiveOwnerThread()) {
           int nextc = c + acquires;
           if (nextc < 0)
               throw new Error("Maximum lock count exceeded");
           setState(nextc);
           return true;
       }
       // 如果到这里,说明前面的if和else if都没有返回true,说明没有获取到锁
       return false;
   }


3 结语

ReentrantLock使用内部类Sync来管理锁,所以真正的获取锁是由Sync的实现类控制的。在进行前先判断锁内是否有数据,没有锁就选择Sync继承AQS来实现进入锁内;如果锁内有数据则先判断数据是否是自己的,是自己的数据就将state的值+1,表示重入。

目录
相关文章
|
17小时前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
17小时前
|
Java
ReentrantLock(可重入锁)源码解读与使用
ReentrantLock(可重入锁)源码解读与使用
|
16小时前
|
Java
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
8 1
|
16小时前
|
安全 Java
ReentrantLock 原理你都知道吗?
通过以上步骤和示例代码,你应该对 ReentrantLock 的工作原理有了清晰的理解。欢迎关注威哥爱编程,一起学习成长。
|
17小时前
|
安全 Java
大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
字节跳动大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
15 0
|
8月前
|
Java
多线程和并发编程(3)—AQS和ReentrantLock实现的互斥锁
多线程和并发编程(3)—AQS和ReentrantLock实现的互斥锁
53 0
|
8月前
|
算法
ReentrantLock 是如何实现可重入性的?
ReentrantLock 是如何实现可重入性的?
39 0
|
12月前
|
安全 Java
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
67 0
并发编程-19AQS同步组件之重入锁ReentrantLock、 读写锁ReentrantReadWriteLock、Condition
AQS(abstractQueuedSynchronizer)锁实现原理详解
AQS(abstractQueuedSynchronizer)抽象队列同步器。其本身是一个抽象类,提供lock锁的实现。聚合大量的锁机制实现的共用方法。
121 0
ReentrantLock可重入锁、公平锁非公平锁区别与实现原理
ReentrantLock可重入锁、公平锁非公平锁区别与实现原理