zoukankan      html  css  js  c++  java
  • 再谈AQS

    AQS是jdk层面实现的锁。

    主要依靠同步队列和条件队列实现原理。

    我们从一个实际的场景出发去讲一下这个原理。

    1、线程A,B,C想要抢占一个资源做操作;

    2、线程A先得头筹获得了对象的锁。在它持有资源的同时,其他线程就会被阻塞,依次加入到同步队列中去,顺序为B,C;

    3、并且每一个Node入队都会自旋检查自己前一个节点是不是signal状态,如果是signal状态,就阻塞自己,等待唤醒;如果不是,就自旋【尝试获取锁,获取不到就尝试将它变成signal状态】这个过程;

    4、当线程A执行完毕后,它会释放锁,然后唤醒同步队列的头结点,这时候头结点B就会去获取锁;

    5、当B获得锁之后,他发现之前线程A的操作让当前资源队列的元素为空,而它要做的操作是一个take()操作。无法执行,会一直阻塞。要怎么办呢?

    6、这时候就会把它添加到条件队列当中,然后释放锁,让其他线程获取资源,直到满足线程B执行操作的条件为止;

    7、释放锁之后,唤醒了同步队列的头结点C,此时C获得了资源。它对着资源队列执行了put()操作;

    8、此时,条件队列中的节点B将被唤醒,从条件队列转移到同步队列的队尾中去;

    9、等线程C执行完put()操作,释放锁,然后唤醒了同步队列中的第一个节点B;

    10、然后线程B执行take()操作。并发结束。

    以上就是一个简单的锁模型。

    对于锁的状态state,是一个int值。

    还有一个超时时间。这些子类自己去实现规则。

    同步队列和条件队列的元素都是Node

    Node中主要有这些参数:

    waitStatus 当前节点的状态。主要有0(初始化),1(取消),-1(SINGAL)【同步队列】,-2(CONDITION)【条件队列】,-3(PROPAGATE )【共享锁】

    是排他锁还是共享锁是根据Node中的字段标记的。

    nextWaiter,在条件队列中,指下一个节点;在同步队列中,指什么属性的锁。

    Thread 绑定的当前线程。

  • 相关阅读:
    【微信小程序】自定义模态框实例
    编程微刊第四期文章汇总(2018.4)
    ajax实现简单的点击左侧菜单,右侧加载不同网页
    JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
    bootstrap+fileinput插件实现可预览上传照片功能
    css实现悬浮效果的阴影
    推荐一款优雅高效的免费在线APP原型工具
    前端工程师提高工作效率的几个小技巧
    程序员常用的六大技术博客类
    程序媛,坚持这几个好习惯让你越来越美
  • 原文地址:https://www.cnblogs.com/hekiraku/p/12341345.html
Copyright © 2011-2022 走看看