zoukankan      html  css  js  c++  java
  • Java并发-J.U.C之AQS

    AQS(Abstract Queue Synchronizer)介绍

    【死磕Java并发】—–J.U.C之AQS(一篇就够了)

     下面讲解具体的Java并发工具类

    1 CountDownLatch

    参考博客:https://www.cnblogs.com/dolphin0520/p/3920397.html

      CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

      CountDownLatch类只提供了一个构造器:

    public CountDownLatch(int count) {  };  //参数count为计数值

      然后下面这3个方法是CountDownLatch类中最重要的方法:

    public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
    public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
    public void countDown() { };  //将count值减1

     2 Semaphore

      计数信号量用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。信号量还可以用来实现某种资源池,或者对容器施加边界。

      Semaphore管理着一组许可(permit),许可的初始数量可以通过构造函数设定,操作时首先要获取到许可,才能进行操作,操作完成后需要释放许可。如果没有获取许可,则阻塞到有许可被释放。如果初始化了一个许可为1Semaphore,那么就相当于一个不可重入的互斥锁(Mutex)。

    代码示例1:简单使用

    代码示例2:获取多个许可

    代码示例3:尝试获取许可,如果获取不到,就不执行了

    代码示例4:尝试获取许可,并设置尝试时间

     3 CyclicBarrier

      字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

      CyclicBarrier与CountDownLatch的区别:CountDownLatch是一个或多个线程等待其他线程执行完再执行;而CyclicBarrier是一组线程都等待至某个状态后再全部同时执行。

    CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器:

    public CyclicBarrier(int parties, Runnable barrierAction) {
    }
     
    public CyclicBarrier(int parties) {
    }

    参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。

    然后CyclicBarrier中最重要的方法就是await方法,它有2个重载版本:

    public int await() throws InterruptedException, BrokenBarrierException { };
    public int await(long timeout, TimeUnit unit)throws InterruptedException,BrokenBarrierException,TimeoutException { };

    第一个版本比较常用,用来挂起当前线程,直至所有线程都到达barrier状态再同时执行后续任务;

    第二个版本是让这些线程等待至一定的时间,如果还有线程没有到达barrier状态就直接让到达barrier的线程执行后续任务。

    4 锁

    ReentrantLock:参考博客 https://www.jianshu.com/p/155260c8af6c

    ReentrantReadWriteLock:读写锁

    StampedLock:

  • 相关阅读:
    static变量的生命周期
    关于C++的new是否会对内存初始化的问题
    行列式的本质是什么?
    C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
    C++拷贝(复制)构造函数详解
    随机生成指定长度字符字符串(C语言实现)
    【npm】npm install的报错
    【HTTP】http请求url参数包含+号,被解析为空格
    【ngx-ueditor】百度编辑器按下Shift键不触发contentChange事件
    【Angular】No component factory found for ×××.
  • 原文地址:https://www.cnblogs.com/panlei3707/p/11083277.html
Copyright © 2011-2022 走看看