CountDownLatch,CyclicBarrier,Semaphore与AQS

AQS:AbstractQueuedSynchronizer,抽象队列同步器,它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)。

使用方法是创建自定义的锁类,然后在锁内部实现内部类继承AQS,并实现AQS的固定方法。

AQS使用一个int类型的成员变量state来表示同步状态,当state>0时表示已经获取了锁,当state = 0时表示释放了锁。它提供了三个方法(getState()、setState(int newState)、compareAndSetState(int expect,int update))来对同步状态state进行操作,当然AQS可以确保对state的操作是安全的。

AQS通过内置的FIFO同步队列来完成资源获取线程的排队工作,如果当前线程获取同步状态失败(锁)时,AQS则会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,则会把节点中的线程唤醒,使其再次尝试获取同步状态。

独占式同步状态重要方法:

Acquire:尝试获取锁

tryRelease: 尝试释放同步状态

共享式同步状态重要方法:

acquireShared: 尝试获取锁

releaseShared: 释放共享同步状态

当需要阻塞或者唤醒一个线程的时候,AQS都是使用LockSupport这个工具类来完成的。LockSupport是用来创建锁和其他同步类的基本线程阻塞原语,park阻塞当前线程,unpark唤起某个线程

CountDownLatch

最重要的方法是await,调用await方法的线程会被挂起,线程会等待只到count值为0才继续执行,一旦count被减为0,就无法再继续使用

CyclicBarrier

回环栅栏,通过它可以实现让一组线程等待至barrier状态之后再全部同时执行,可以被重复使用。他也有一个await方法,一旦被调用之后,该线程就处于barrier状态了。

Semaphore

信号量,Semaphore可以控制同时访问线程的个数,通过acquire()方法获取一个许可,如果没有许可该线程就阻塞,使用许可完成之后,调用release()释放一个许可。

你可能感兴趣的:(CountDownLatch,CyclicBarrier,Semaphore与AQS)