AQS

作者: 温不胜_kangle | 来源:发表于2020-05-20 08:45 被阅读0次

    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

    相关文章

      网友评论

          本文标题:AQS

          本文链接:https://www.haomeiwen.com/subject/rvawohtx.html