zoukankan      html  css  js  c++  java
  • 深入浅出AQS之组件概览

    之前分析了AQS中的独占锁,共享锁,条件队列三大模块,现在从结构上来看看AQS各个组件的情况。

    原文地址:http://www.jianshu.com/p/49b86f9cd7ab

    深入浅出AQS之独占锁模式
    深入浅出AQS之共享锁模式
    深入浅出AQS之条件队列
    前面三篇文章如果之前没有AQS基础的话看起来会比较吃力,这篇文章说明一下AQS的基础知识,方便快速了解AQS。

    首先AQS的基本执行过程就是尝试获取锁,成功则返回,如果失败就进入同步队列进行锁资源的等待。基于这个流程可以看出队列跟队列中的节点应该是两个重点。

    首先来看下AQS里队列节点Node的结构:

    Node节点
    该类中有五个字段,依次来看一下:

    1. prev,next:指向它的前置节点跟后继节点,由此看出AQS中的同步队列是个双向链表。
    2. thread:当前线程对象。
    3. waitStatus:当前节点的状态,是个int类型变量,依次有如下几种:
    类型 说明
    -1 SIGNAL 当前节点的后继节点被阻塞,因此当当前节点在释放或者取消的时候需要唤醒它的后继节点。
    1 CANCELLED 当前节点由于超时或者中断被取消,节点进入这个状态以后将保持不变。注:这是唯一大于0的值,很多判断逻辑会用到这个特征
    -2 CONDITION 当前节点正处在条件队列中,在条件达成前不能获取锁。
    -3 PROPAGATE 当前节点获取到锁的信息需要传递给后继节点,共享锁模式使用该值。
    0 节点初始状态。
    1. nextWaiter:如果当前节点是共享模式,该值会指向一个SHARE节点。如果当前节点是在条件队列中,则该值会指向下一个等待条件的节点。

    了解了Node节点的数据结构以后,看下独占锁模式下的同步队列的结构:

    独占锁同步队列
    注:head节点是new出来一个新的Node节点,而tail是直接指向队列中最后一个节点。

    了解了独占锁模式队列以后,看下共享锁模式下的同步队列(注意对比其中的不同):

    共享锁同步队列
    注:共享锁跟独占锁是同一个同步队列,也就是说同步队列中的节点既可以是共享类型也可以是独占类型。

    除了独占锁跟共享锁使用的同步队列,还有一个很重要的队列就是条件队列,一起看下:

    条件队列

    注意区分条件队列跟同步队列的区别:1、头尾指针,2、单链表

    搞明白了AQS中这些基础的数据结构以后,最后再看下AQS对外提供的API:
    独占锁模式:

    方法名 说明
    acquire 独占模式获取锁,不响应中断,如果发生中断只会把当前线程的中断状态设置为true
    acquireInterruptibly 独占模式获取锁,如果在获取锁的过程中线程被中断,则直接抛出中断异常
    release 释放锁资源

    共享锁模式:

    方法名 说明
    acquireShared 共享模式获取锁,不响应中断,如果发生中断只会把当前线程的中断状态设置为true
    acquireSharedInterruptibly 共享模式获取锁,如果在获取锁的过程中线程被中断,则直接抛出中断异常
    releaseShared 释放锁资源

    条件队列:

    方法名 说明
    await 阻塞等待条件,如果被中断则抛出中断异常
    awaitUninterruptibly 阻塞等待条件,不响应中断,如果发生中断只会把线程中断状态设置为true
    awaitNanos 等待纳秒时间,如果被中断则抛出中断异常
    awaitUntil 等待直到一个截止时间,如果被中断则抛出中断异常
    await(long time, TimeUnit unit) 等待一个指定时间,如果被中断则抛出中断异常
    signal 唤醒等待队列中的第一个节点
    signalAll 唤醒等待队列中的所有节点

    扩展API:

    方法名 说明
    tryAcquire 尝试获取独占锁,不阻塞
    tryAcquireNanos 尝试在指定纳秒时间内获取独占锁,如果被中断则抛出中断异常
    tryRelease 尝试释放独占锁,不阻塞
    tryAcquireShared 尝试获取共享锁,不阻塞
    tryAcquireSharedNanos 尝试在指定纳秒时间内获取共享锁,如果被中断则抛出中断异常
    tryReleaseShared 尝试释放共享锁,不阻塞

    了解了上面介绍的关于AQS的基础数据结构及API以后,再去看我之前写的三篇分别介绍独占锁,共享锁,条件队列实现原理的文章就不会云里雾里了。

  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/lfls/p/7666375.html
Copyright © 2011-2022 走看看