博客
关于我
【腾讯阿里最全面试题】介绍下Synchronized、Volatile、CAS、AQS,以及各自的使用场景...
阅读量:275 次
发布时间:2019-03-01

本文共 1256 字,大约阅读时间需要 4 分钟。

AQS(AbstractQueuedSynchronizer)是Java并发工具包中一个核心的同步框架,广泛应用于实现多种锁和同步组件,如ReentrantLock、CountDownLatch等。以下是对AQS的详细分析:

AQS的结构与机制

AQS维护了一个状态值和一个FIFO双向队列,用于管理线程的同步和等待。状态值通过volatile修饰确保线程间的可见性,保证锁的状态一致性。队列中的节点包含线程和相关状态信息,用于处理线程的等待和唤醒。

核心组件

  • 状态值(state):用于表示锁的状态,可能用于计数重入次数或其他同步逻辑。
  • 双向队列:FIFO结构,用于存储等待锁的线程,确保先进先出的顺序。
  • 队列节点

    每个节点包含以下信息:

    • waitStatus:线程的等待状态,可能为SIGNAL、CONDITION等值。
    • 前驱节点(prev)后驱节点(next),构成FIFO队列。
    • 当前线程(thread):等待锁的线程。

    AQS的工作流程

  • 获取锁:调用lock()方法,尝试修改状态值和队列。如果成功,线程继续执行;如果失败,线程被加入队列等待。
  • 释放锁:调用unlock()方法,修改状态值,并从队列中取出线程,唤醒它。
  • 节点插入:线程竞争锁失败时,构造节点并插入队列。
  • 节点删除:线程获取锁后,删除自己从队列中的节点。
  • 唤醒线程:线程释放锁后,唤醒队列中的下一个线程。
  • AQS的锁类型

    AQS支持两种资源共享方式:

  • 独占锁:同一时间仅有一个线程持有锁,适用于ReentrantLock。
  • 共享锁:多个线程可同时持有锁,适用于ReentrantReadWriteLock。
  • ReentrantLock的实现

    ReentrantLock基于AQS实现独占锁。它的lock()方法通过递增状态值获取锁,unlock()方法递减状态值释放锁。线程在竞争锁时,使用循环的acquire()方法,通过CAS操作尝试获取锁,失败时加入队列。

    CountDownLatch的实现

    CountDownLatch基于AQS的独占锁实现。它维护一个计数器,countDown()方法递减计数器,当计数器为零时,等待的线程被唤醒。

    性能与优化

    AQS使用自旋机制,线程在释放锁后继续执行,减少等待时间。Java6后引入偏向锁优化,允许线程在无竞争情况下直接获取锁,进一步提升性能。

    应用场景

    • ReentrantLock:用于需要重入锁控制的场景,比如资源池管理。
    • ReentrantReadWriteLock:用于读写锁控制,支持多个读线程同时访问,但一旦有写线程进入,所有读线程等待。
    • CountDownLatch:用于等待多个线程完成任务后,唤醒主线程。
    • Semaphore:用于控制资源的可用次数,允许多个线程同时使用资源。

    总结

    AQS通过状态值和FIFO队列实现线程同步,支持独占和共享锁模式。其灵活性和高效性使其成为Java并发工具包的核心同步框架。理解AQS有助于深入掌握Java多线程编程中的锁与同步机制。

    转载地址:http://aaqa.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现均值滤波(附完整源码)
    查看>>
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>
    Objective-C实现多组输入(附完整源码)
    查看>>
    Objective-C实现字符串manacher马拉车算法(附完整源码)
    查看>>
    Objective-C实现字符串wildcard pattern matching通配符模式匹配算法(附完整源码)
    查看>>
    Objective-C实现字符串word patterns单词模式算法(附完整源码)
    查看>>
    Objective-C实现将彩色图像转换为负片算法(附完整源码)
    查看>>
    Objective-C实现将给定的 utf-8 字符串编码为 base-16算法(附完整源码)
    查看>>
    Objective-C实现数除以二divideByTwo算法(附完整源码)
    查看>>
    Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
    查看>>
    Objective-C实现显示响应算法(附完整源码)
    查看>>
    Objective-C实现最小二乘多项式曲线拟合(附完整源码)
    查看>>
    Objective-C实现最快的归并排序算法(附完整源码)
    查看>>
    Objective-C实现最长公共子序列算法(附完整源码)
    查看>>
    Objective-C实现最长子数组算法(附完整源码)
    查看>>
    Objective-C实现最长字符串链(附完整源码)
    查看>>
    Objective-C实现有限状态自动机FSM(附完整源码)
    查看>>