美文网首页
CountDownLatch,CyclicBarrier,Sem

CountDownLatch,CyclicBarrier,Sem

作者: 马斯费油 | 来源:发表于2019-12-15 22:06 被阅读0次

    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,Sem

          本文链接:https://www.haomeiwen.com/subject/yyvlnctx.html