reentlock原理

reentlock
的实现依赖硬件支持CAS操作
Compare and swap
原始值,目标值,期望值
当目标值 = 期望值时,认为修改成功。
当目标值 != 期望值时,肯定是别的操作已经修改了。放弃

jdk下的并发包Atomic目录下的类就是封装了原子的操作类

AQS内部抽象类
AbstractQueuedSynchronizer
主要的成员变量
state volitile修饰表示锁被抢占的状态,对它的修改都是用的cas操作
一个双向链表,其中每个Node节点信息:
waitstatus四个状态值singal cancel 初始化 condition 独占模式还是共享模式
线程的信息
前序节点 后序节点

加锁的过程
公平锁,直接放到队列尾
非公平锁,先尝试加锁,没有抢到放到队尾
查看status是否为0,是的线程抢占到锁。
不为0,则addWaiter操作,在双向链表的尾部添加node节点。这步操作也是CAS操作,保证多线程的安全。
之后进入死循环,检查前序节点是否为head节点。
前序节点是head的话,抢占锁。如果不是head节点的话,线程进入阻塞状态。

解锁的过程
解锁后,status-1。当status为0时。
通知head节点的下一个节点,唤醒状态。从而进入上述的死循环。

引用:https://blog.csdn.net/javazejian/article/details/75043422

你可能感兴趣的:(reentlock原理)