AQS原理

AQS是一个构建锁和同步器的并发框架,是AbstractQueuedSynchronizer的缩写,常见AQS实现的同步器框架有ReentrantLock,Semaphore,Latch,Barrier,BlockingQueue等多种多线程访问共享资源的同步器框架,AQS是一种依赖状态(state)的同步器。

AQS具备的五大特性:

阻塞等待队列、共享/独占、公平/非公平、可重入、允许中断

用AQS构建的同步器框架实现原来都是:

1、定义内部类Sync继承AQS类

2、将同步器所有调用方法都映射到Sync对应的方法上

AQS内部维护共享变量volatile修饰的state, volatile int state=0; volatile保证多线程及时可见性

state的三种方法调用 getState() setState() compareAndSetState()[基于CAS原子操作的方法]

AQS对资源共享有两种方式:

  • Exclusive(独占):只有一个线程能执行,如ReentrantLock。又可分为公平锁和非公平锁:
    • 公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
    • 非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的
  • Share(共享):多个线程可同时执行,如Semaphore/CountDownLatch。Semaphore、CountDownLatCh、 CyclicBarrier、ReadWriteLock等

AQS有两种等待队列:

1、同步等待队列

同步等待队列页脚CLH队列,低层是一个双向链表数据结构的队列,先进先出FIFO,存在一个head和一个tail,当线程进入队列的时候从自旋机制改成阻塞机制。

AQS原理_第1张图片

2、条件等待队列
是一个单向链表的队列,只有当该条件Condition具备时,才会存在此单向链表,或者等待线程才会被唤醒。

AQS原理_第2张图片

 AQS加锁的方法有require,释放锁的方法release

用到的设计模式是模板设计模式。

其实是基于自旋锁 、LockSupport、CAS原子操作、queue阻塞队列实现的。

你可能感兴趣的:(并发编程,java,AQS)