• 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:

  • 相关阅读:
    c# 基础算法(一) 九九乘法
    万能模糊查询SQL
    C#通过连接ODBC的方式调用存储过程
    《从设计到模式》学习笔记part1
    C#知识归纳
    Python之路
    Tomcat优化
    Zabbix 3.0 + Nginx + Mariadb
    Spark DataFrame ETL教程
    Python连接presto
  • 原文地址:https://www.cnblogs.com/panlei3707/p/11083277.html
Copyright © 2020-2023  润新知