`

读CountDownLatch源码

阅读更多
//在完成一组操作之前允许一个或多个线程等待内部用的AQS

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;
            }
        }
    }


//先看构造函数
public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
	//初始化sync.
        this.sync = new Sync(count);
    }


//阻塞当前线程
public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

//阻塞指定时间超时返回false
public boolean await(long timeout, TimeUnit unit)
        throws InterruptedException {
        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
    }

//递减count.0则唤醒等待的所有线程。
public void countDown() {
        sync.releaseShared(1);
    }

//获取当前计数器数量
public long getCount() {
        return sync.getCount();
    }

public String toString() {
        return super.toString() + "[Count = " + sync.getCount() + "]";
    }
分享到:
评论

相关推荐

    毕向东 笔记源码

    源码,即编程语言的原始代码,是程序员用人类可读的形式编写的程序,未经过编译器转换成机器语言。在Java中,源代码以.java文件的形式存在。通过阅读和分析源码,我们可以了解程序的设计思路、实现方法以及编程技巧...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    2. 共享模式:适用于如CountDownLatch、Semaphore等共享资源,允许多个线程同时获取资源。 二、LockSupport工具类的设计与实现 LockSupport是线程阻塞和唤醒的低级工具,提供了park()和unpark()方法,用于线程的挂...

    《Java并发编程高阶技术-高性能并发框架源码解析与实战》学习.zip

    再者,CopyOnWriteArrayList是一种特殊的线程安全列表,它通过复制原列表来保证并发安全,适用于读多写少的场景,提供了高效的迭代性能。 同步工具类如Semaphore(信号量)、CyclicBarrier(回环栅栏)和...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **CountDownLatch**:一次性计数器,用于等待多个任务完成。 - **CyclicBarrier**:允许多个线程互相等待到达某个点再继续执行。 - **Phaser**:类似CyclicBarrier,但更加灵活,支持动态调整参与线程数。 4. ...

    java高并发编程源码.zip

    - **CopyOnWriteArrayList/CopyOnWriteArraySet**:写时复制策略,读操作无锁,写操作复制整个数组,适合读多写少的场景。 5. **线程池**: - **ExecutorService**:Java并发框架的一部分,提供线程池服务,可以...

    javaconcurrent源码-java7-source-code:Java7源码/Concurrency同步

    CountDownLatch 闭锁 AQS 锁的公共类 20180514 String, 部分Character 20180508 除 Set 外, 常用的 Collection 都已经分析完毕 简化语言描述, 增加测试用例(实践用法) 接触到新的类再看源码(不能脱离实际场景瞎看, ...

    Java并发编程的艺术源码

    - `CyclicBarrier`和`CountDownLatch`: 同步辅助类,允许一组线程等待其他线程到达某个点后继续执行。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 4. **并发集合** - `ConcurrentHashMap`: 并发...

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    基于JDK源码解析Java并发锁,我们需要关注以下几个关键知识点: 1. **AQS(AbstractQueuedSynchronizer)基础同步器**: AQS是一个用于构建锁和同步器的框架,它维护了一个FIFO的等待队列,提供了两种模式:独占和...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java多线程源码笔记.pdf

    ReentrantReadWriteLock是读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 7. 线程池:Java提供了ExecutorService和ThreadPoolExecutor等工具来管理线程池,线程池可以有效控制运行的线程数量...

    thinkinjava源码-thinkInJava:java编程思想

    14. **并发编程**:Java并发库如ExecutorService、Future、Callable等的使用,以及并发工具类如Semaphore、CountDownLatch等。 15. **Lambda表达式与函数式编程**:Java 8引入的Lambda表达式和Stream API,让代码更...

    java并发编程艺术源码-ArtConcurrentBook:JAVA并发编程的艺术

    - **读写锁**:`ReentrantReadWriteLock`允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 3. **并发工具类** - **Future和Callable**:`Future`代表异步计算的结果,`Callable`定义了计算任务,它们...

    File 线程读写

    - 并发读操作通常是安全的,因为读操作不会改变文件内容。但并发写操作需要特别注意,一般需要使用互斥锁或者文件通道的原子操作来确保写操作的顺序。 3. **文件锁(File Locking)**: - 在Java中,`java.nio....

    java并发集合

    这种方式保证了读操作的高性能,但写操作相对较慢,适用于读多写少的场景。 3. **BlockingQueue**:阻塞队列是一种特殊类型的线程安全队列,它支持阻塞的插入(put)和移除(take)操作。常见的实现有...

    java 线程

    合理使用并发工具类,如`Semaphore`, `CountDownLatch`等;避免过度优化,考虑实际应用场景。 5. **源码分析** - 学习Java的线程模型,如JVM如何调度线程,可以阅读JDK源码中`java.lang.Thread`和`java.lang....

    java多线程设计模式详解

    此外,还可以使用Semaphore信号量、CountDownLatch倒计时锁、CyclicBarrier同步屏障等工具类。 以上是部分Java多线程设计模式的概述,每个模式都有其适用场景和优缺点。实际开发中,开发者应根据需求选择合适的模式...

Global site tag (gtag.js) - Google Analytics