Java JUC锁—工具类(CountDownLatch/CyclicBarrier/Semaphore/Exchanger/Phaser)

一、同步计数器CountDownLatch

  1. 定义:使一个线程等待其他线程各自执行完毕后再执行。

    是通过一个计数器来实现的,计数器初始值为线程的数量,每当一个线程执行完毕后,计数器的值就减1,当计数器的值为0时,表示所有的线程都执行完毕,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务,缺点是只能使用一次。

  2. 常用API

    A. CountDownLatch(int count):构造方法,创建一个值为count的计数器;

    B. await():阻塞当前线程,将当前线程加入阻塞队列;

    C. await(long timeout, TimeUnit unit):在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行;

    D. countDown():对计数器进行递减1操作,当计数器递减至0时,当前线程会去唤醒阻塞队列里的所有线程;

  3. 应用场景

    A. 某一个线程在开始运行前等待n个线程执行完毕;

    B. 实现多个线程开始执行任务的最大并行性。

  4. 实例

 

二、循环栅栏CyclicBarrier

  1. 定义:让所有线程都等待完成后才进行下一步行动。

  2. 常用API

    A. CyclicBarrier(int parties):当给定数量的线程等待它时,它将跳闸,并且当屏障跳闸时不执行预定义的动作;

    B. await():等待所有parties已经在这个障碍上调用了await;

    C. reset():将屏障重置为初始状态;

  3. CountDownLatch与CyclicBarrier区别

    A. CountDownLatch是线程组之间的等待,即一个(或多个)线程等待N个线程完成某件事情之后再执行;而CyclicBarrier则是线程组内的等待,即每个线程相互等待,即N个线程都被拦截之后,然后依次执行;

    B. CountDownLatch是减计数方式,而CyclicBarrier是加计数方式;

    C. CountDownLatch计数为0无法重置,而CyclicBarrier计数达到初始值,则可以重置;

    D. CountDownLatch不可以复用,而CyclicBarrier可以复用;

  4. 应用场景

    A. 某一个线程在开始运行前等待n个线程执行完毕;

  5. 实例

 

三、信号量Semaphore

  1. 定义:是一个计数器,用来保护一个或多个共享资源的访问,要想访问必须拿到许可证,使用完毕释放许可证;

  2. 常用API

    A. Semaphore(int permits):非公平模式指定最大允许访问许可证数量;

    B. acquire():从信号量获取一个许可,如果无可用许可前将一直阻塞等待;

    C. release():释放一个许可,别忘了在finally中使用;

  3. 应用场景

    A. 限制获取某种资源的线程数量;

    B. 接口限流;

  4. 实例

 

四、交换者Exchanger

  1. 定义:指两个线程在运行过程中需要交换彼此的信息,前提是达到提供的同步点才可以交换数据,第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据,注意等待的线程是被挂起,而到达的线程会唤醒等待的线程;

  2. 常用API

    A. Exchanger():无参构造方法;

    B. V exchange(V x):等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象;

    C. V exchange(V x, long timeout, TimeUnit unit):等待另一个线程到达此交换点(除非当前线程被中断或超出了指定的等待时间),然后将给定的对象传送给该线程,并接收该线程的对象;

  3. 应用场景

    A. 遗传算法;

    B. 校对工作;

    C. 流水线设计;

  4. 实例

 

五、Phaser

 

posted @ 2020-07-24 10:08  如幻行云  阅读(146)  评论(0编辑  收藏  举报