ReentrantLock加锁原理源码图
2021-01-24 11:22:19 5 举报
ReentrantLock加锁原理源码图
作者其他创作
大纲/内容
Node.SIGNAL可被唤醒
LockSupport.park(this);
第2轮循环,阻塞线程,并且需要判断线程是否是有中断信号唤醒的!
一个线程抢锁失败,入队成功,开始阻塞。如果是第一个节点,还会再尝试获取锁
可重入锁的特性就是在这里提现的可重入的意义:方法里会调别的方法,
ReentrantLock lock = new ReentrantLock(true);
addWaiter
非公平锁,可以看见直接就抢
没有获取到,线程阻塞,等待被唤醒
公平锁
Thread.currentThread().interrupt();
没有获取到锁的
selfInterrupt()
final void lock() { acquire(1);}
tryAcquire
没获取到锁进行入队
1.首先第1轮循环、修改head的状态,修改成sinal=-1标记处可以被唤醒.
abstract void lock();
先初始化个空节点作为头节点,避免空指针
enq(node)
abstract static class Sync extends AbstractQueuedSynchronizer {
sync.lock();
node当前节点,prev是前驱节点
入队也要用CAS保证原子性
获取到节点出队,并且把head往后挪动1个,新的头节点
lock.lock()
获取锁的逻辑
没有获取到锁,线程阻塞,Park阻塞线程唤醒有两种方式: 1、中断 2、release()
0 条评论
下一页