1 个回答
以非公平锁为了,我们在外界调用lock方法的时候,源码是这样实现的:
1):CAS尝试获取锁,获取成功则可以执行同步代码
2):CAS获取失败,则调用acquire方法,acquire方法实际上就是AQS的模板方法
3):acquire首先会调用子类的tryAcquire方法(又回到了ReentrantLock中)
4):tryAcquire方法实际上会判断当前的state是否等于0,等于0说明没有线程持有锁,则又尝试CAS直接获取锁
5):如果CAS获取成功,则可以执行同步代码
6):如果CAS获取失败,那判断当前线程是否就持有锁,如果是持有的锁,那更新state的值,获取得到锁(这里其实就是处理可重入的逻辑)
7):CAS失败&&非重入的情况,则回到tryAcquire方法执行「入队列」的操作
8):将节点入队列之后,会判断「前驱节点」是不是头节点,如果是头结点又会用CAS尝试获取锁
9):如果是「前驱节点」是头节点并获取得到锁,则把当前节点设置为头结点,并且将前驱节点置空(实际上就是原有的头节点已经释放锁了)
10):没获取得到锁,则判断前驱节点的状态是否为SIGNAL,如果不是,则找到合法的前驱节点,并使用CAS将状态设置为SIGNAL
11):最后调用park将当前线程挂起
发布于:2年前 (2023-03-16) IP属地:四川省
我来回答
您需要 登录 后回答此问题!