JAVA AQS 的理解

  1. AQS是⼀个JAVA线程同步的核心组件。是JDK中很多锁⼯具的核心组件。
  2. AQS的锁是先尝试CAS乐观锁去获取锁,获取不到,才会转换为悲观锁
  3. 在AQS中,维护了⼀个信号量state、加锁线程变量和⼀个线程组成的双向链表队列。
  4. 加锁

    加锁的线程,会根据公平性,决定是否要排队。公平锁,直接到队尾排队。非公平锁,先尝试加锁,如果失败,则到队尾排队

  5. 解锁

    解锁,会唤醒等待队列中的后继节点

  6. 加锁线程变量就是当前加锁的线程

    可以用来做锁的可重入

  7. state 是一个int, 加锁和解锁都是通过CAS操作state值来实现的
    • 通过 volatile 修饰 和 CAS 更新保证了操作的安全性。 其中volatile 保证了可见性,同时禁止指令重排序。但是不保证原子性. CAS 底层是使用 CPU 指令 cmpxchg 对内存中的变量进行比较和交换。
    • state 可以用来表示锁重入次数。state=0表示没有线程持有锁,state>0表示有state个线程持有锁,eg: ReentrantLock
    • state 还可以用来表示获取操作的线程数据。eg: countdownlatch

参考文档

results matching ""

    No results matching ""