AQS

2020-05-20  本文已影响0人  温不胜_kangle

AQS

(1)AQS的核心是一个同步状态、两个队列,它们实现了java函数中个的锁同步(synchronized)、锁等待(await、notify),并在此基础上实现了独占式和共享式两种方法锁。

(2)无论是独占式还是共享式在获取同步状态成功时,直接返回,在获取同步状态失败时,则加入到LCH同步队列的尾部,并阻塞当前线程。当持有同步状态的线程释放同步状态时,LCH队列中的head节点会尝试重新获取同步状态,成功则出队,失败则继续等待。

(3)获取同步状态的线程可以调用condition()对象,将当前线程的同步状态释放,并加入到阻塞队列中,直到其他线程调用condition.signal或condition.signAll唤醒,从阻塞状态中释放,重新竞争获取同步状态成功后,从原来指令位置继续执行。

CLH

同步队列,通过链式方式实现FIFO双向队列。

共享式和独占式的区别

(1)概念上:针对的资源不同,独占式对应一个资源,并且只能被一个线程或者竞争者占有,而共享式对应存在多个资源,可以被多个线程或者竞争者共同占有。

(2)流程上:尝试获取同步失败 --> 进入等待队列排队 --> 阻塞当前线程 --> 当等待队列排到自己被唤醒 --> 尝试获取锁(可能被其他线程插队而导致获取锁失败,失败在次阻塞,等待下次排到自己)-->尝试获取锁成功,通知等待队列前面共享节点线程从阻塞中唤醒--> 执行自己的业务逻辑 --> 尝试释放锁--> 成功通知等待队列前面共享节点线程从阻塞中唤醒。 (只有黑色的部分是共享式独有的,独占式是在释放同步状态的时候通知的,共享式针对的资源比较多,会在获取锁的时候唤醒其他线程)

参考:

作者:贪睡的企鹅   链接:https://www.jianshu.com/p/92568acbe5e6

上一篇下一篇

猜你喜欢

热点阅读