zoukankan      html  css  js  c++  java
  • CountDownLatch

    1、CountDownLatch是一个线程同步类,位于java.util.concurrent包中。

    工作方式:CountDownLatch通过计数器来实现的,计数器的初始值为线程的数量,每当一个线程执行完,计数器就减1,当计数器为0时,调用了await()处于等待的线程就恢复执行任务。

    实现原理:让需要的暂时阻塞的线程,进入一个死循环里面,得到某个条件后再退出循环,以此实现阻塞当前线程的效果。

    通过内部类Sys继承AbstractQueuedSynchronizer实现

    构造方法、await()、countDown、await(long time, TimeUnit unit)。

    线程要对异常进行处理。

    有哪些典型的应用。

    CountDownLatch是不可逆的,即不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法,也就是只能创建CountDownLatch对象,并使其内部值减少,不能重新修改或增加内部值。当计数器到达0时, 全部调用 await() 方法将会立刻返回,后面再调用此CountDownLatch对象的countDown() 方法都将不会产生任何作用。后续会介绍CyclicBarriar,它除了可以实现CountDownLatch的功能外,还可以重新进行初始化,重复使用。 

    部分源码:

    private static final class Sync extends AbstractQueuedSynchronizer {
            private static final long serialVersionUID = 4982264981922014374L;
    
            Sync(int count) {
                setState(count);
            }
    
            int getCount() {
                return getState();
            }
    
            protected int tryAcquireShared(int acquires) {
                return (getState() == 0) ? 1 : -1;
            }
    
            protected boolean tryReleaseShared(int releases) {
                // Decrement count; signal when transition to zero
                for (;;) {
                    int c = getState();
                    if (c == 0)
                        return false;
                    int nextc = c-1;
                    if (compareAndSetState(c, nextc))
                        return nextc == 0;
                }
            }
        }
    
        private final Sync sync;
    
    
        public CountDownLatch(int count) {
            if (count < 0) throw new IllegalArgumentException("count < 0");
            this.sync = new Sync(count);
        }
  • 相关阅读:
    Angular常用VSCode插件
    asp.net MVC设计模式中使用iTextSharp实现html字符串生成PDF文件
    Docker Compose部署 EFK(Elasticsearch + Fluentd + Kibana)收集日志
    强烈推荐这本书《编码:隐匿在计算机软硬件背后的语言》
    frp 内网穿透访问内网Web服务
    代码玄学——镇代码的注释
    C#基础之多线程与异步
    C#基础之事件(1)
    WPF之Unity与ServiceLocator运用
    WPF之实现控件内容拖动
  • 原文地址:https://www.cnblogs.com/xhongqing/p/13920157.html
Copyright © 2011-2022 走看看