Java-JUC(五):闭锁(CountDownLatch)

闭锁(CountDownLatch)

jdk5.0在java.util.concurrent包中提供了CountDownLatch,它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完成才继续执行:

1)确保某个计算在其需要的所有资源都被初始化之后才继续执行;

2)确保某个服务在其他依赖的所有其他服务都已经启动之后才启动;

3)等待直到某个操作所有参与者都准备就绪在继续执行。

CountDownLatch的用法:

 CountDownLatch提供了一个await方法,该方式用于等待前边countdownlatch所统计的线程完成后,才可以向下执行,否则一直等待。

package com.dx.juc.test;

import java.util.concurrent.CountDownLatch;

public class CoutDownLatchTest {
    public static void main(String[] args) {
        Long start=System.currentTimeMillis();
        
        // 线程数
        CountDownLatch countDownLatch=new CountDownLatch(5);
        MyCallable myCallable=new MyCallable(countDownLatch); 
            
        for (int i = 0; i < 5; i++) {
            new Thread(myCallable).start();
        }
        
        try {
            // 等待所有任務完成后,才進行下邊的任務。
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        Long end=System.currentTimeMillis();
        System.out.println("耗时:"+(end-start)+" ms");
    }    
}

class MyCallable implements Runnable {
    private CountDownLatch countDownLatch;

    public MyCallable(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }

    public void run() {
        try {
            int sum = 0;
            for (int i = 0; i <= 100; i++) {
                sum += i;
            }
            System.out.println(sum);
        } finally {
            countDownLatch.countDown();
        }
    }

}

CountDownLatch原理及注意事项

1)CountDownLatch初始化的开启计数个数必须要到达0时,才会跳出等待,这个是等待跳过的一个依赖;

2)如果该统计个数初始化的值,大于调用countDown()的次数,就会导致线程一直等待状态,如下图:图一;

3)它实现的原理,就是给CountDownLatch一个初始化统计数,在监控的线程内部操作完成时,调用countDown()函数,调用一次则初始化监控统计数递减1。当调用了CountDownLatch的实例的await函数时,实际上是一直监控是否初始化监控统计数到达0否,一旦到达0,则跳出等待。进行await等待,向下执行。

图一:

《Java-JUC(五):闭锁(CountDownLatch)》

 

    原文作者:cctext
    原文地址: https://www.cnblogs.com/yy3b2007com/p/8911077.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞