3.Lock锁同步原理
2021-04-19 23:03:39 0 举报
lock同步锁的原理以及和synchronize的区别
作者其他创作
大纲/内容
拿到锁去执行
lock的存储结构:一个int类型状态值(用于锁的状态变更),一个双向链表(用于存储等待中的线程) lock获取锁的过程:本质上是通过CAS来获取状态值修改,如果当场没获取到,会将该线程放在线程等待链表尾部。CAS确保能够在线程安全的情况下,将当前线程加入到链表的尾部。lock释放锁的过程:修改状态值,调整等待链表。同步原理:①通过CAS(乐观锁)去修改state的值(锁状态值)②没有获取到锁,等待获取锁③尝试再次通过CAS获取一次锁。④将当前线程加入上面锁的双向链表(等待队列)中⑤通过自旋,判断当前队列节点是否可以获取锁。
自旋等待状态是否被释放
node
自旋释放
当前等待状态:volatile int waitStatus当前等待线程:volatileThread thread下个等待线程:volatile nextWaiter
将没有获取到锁的线程放到链表尾部
获取锁失败
共享:锁状态值:volatile int state; //int类型变量
synchronized和lock的区别:synchronized是关键字,是JVM层面的底层啥都帮我们做了,而Lock是一个接口,是JDK层面的有丰富的API。synchronized会自动释放锁,而Lock必须手动释放锁。synchronized是不可中断的,Lock可以中断也可以不中断。通过Lock可以知道线程有没有拿到锁,而synchronized不能。synchronized能锁住方法和代码块,而Lock只能锁住代码块。Lock可以使用读锁提高多线程读效率。synchronized是非公平锁,ReentrantLock可以控制是否是公平锁。
成功
上个节点:Node prev;下个节点:Node next;
CAS获取锁
锁存储容器的结构
线程执行到Lock.lock(代码)
锁状态未释放
双向链表(CLH同步队列)
自旋未释放
volatile底层实现: 在JVM底层volatile是采用“内存屏障”来实现的。 lock和Monitor的区别一、lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能。二、Monitor有TryEnter的功能,可以防止出现死锁的问题,lock没有。
尝试再次CAS获取锁
更新AQS的状态
0 条评论
回复 删除
下一页