- 浏览: 62172 次
- 性别:
- 来自: 成都
文章分类
最新评论
//在完成一组操作之前允许一个或多个线程等待内部用的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() + "]"; }
发表评论
-
读ThreadLocal源代码
2017-10-12 15:00 238//可以存取线程局部变量 //先看构造函数 pub ... -
读Exchanger源码
2017-10-10 11:38 327//用于线程间交换数据 public V exchang ... -
读Executors源码
2017-09-29 15:23 256//一个管理线程创建的类里面都是静态方法 //创建一 ... -
读ScheduledThreadPoolExecutor源码
2017-09-25 17:33 403//一个可以延迟执行的定时任务 //先看构造函数 构造函 ... -
读部分ThreadPoolExecutor源码
2017-09-25 15:27 302//线程池 //先看构造方法 public Threa ... -
读AbstractExecutorService
2017-09-23 16:34 320//他是ExecutorService的部分实现 pub ... -
读ExecutorCompletionService源码
2017-09-23 11:22 480//一个用来管理已完成任务的service,内部封装了一个 ... -
读FutureTask源码
2017-09-22 16:45 264//一个可以异步返回计算的结果 //它同时实现了Futu ... -
读ConcurrentSkipListMap源码
2017-09-21 15:11 285//数据结构是跳表 关于数据结构http://blog.c ... -
读Semaphore源码
2017-09-09 14:58 289//一个信号量,只有在池中还拥有许可时才允许线程继续执行。 ... -
读CyclicBarrier源码
2017-09-01 17:59 340//一个循环的屏障。所有的线程在屏障处等待其他线程执行完毕 ... -
读ConcurrentLinkedQueue
2017-09-01 11:40 283//这是一个无阻塞的队列没有加任何锁全部利用CAS机制实现 ... -
读ConcurrentHashMap源码
2017-08-31 11:21 271//先看构造函数 public ConcurrentHa ... -
读CopyOnWriteArrayList源码
2017-08-22 12:59 403//在该集合上的写操作都是在原有的副本上进行的操作。这样可 ... -
读LinkedBlockingDeque源码
2017-08-21 14:26 553//这是一个支持双端操作的可阻塞队列 //先看构造函数 ... -
读SynchronousQueue源码
2017-08-10 10:51 371//先看构造方法 public SynchronousQ ... -
读PriorityBlocking源码
2017-08-09 13:47 350//一个基于而为堆的优先级队列,它是无界的。 //先看构 ... -
读DelayQueen源码
2017-08-07 15:16 270//一个基于二叉堆优先 ... -
LinkedblockingQueue源码解读
2017-08-04 13:03 344//LinkedBlockQueue //先看构造函数 ... -
ArrayBlockingQueue源码解读
2017-08-03 13:53 293//先看构造函数 //初始化一个给定容量的ArrayBl ...
相关推荐
源码,即编程语言的原始代码,是程序员用人类可读的形式编写的程序,未经过编译器转换成机器语言。在Java中,源代码以.java文件的形式存在。通过阅读和分析源码,我们可以了解程序的设计思路、实现方法以及编程技巧...
2. 共享模式:适用于如CountDownLatch、Semaphore等共享资源,允许多个线程同时获取资源。 二、LockSupport工具类的设计与实现 LockSupport是线程阻塞和唤醒的低级工具,提供了park()和unpark()方法,用于线程的挂...
再者,CopyOnWriteArrayList是一种特殊的线程安全列表,它通过复制原列表来保证并发安全,适用于读多写少的场景,提供了高效的迭代性能。 同步工具类如Semaphore(信号量)、CyclicBarrier(回环栅栏)和...
- **CountDownLatch**:一次性计数器,用于等待多个任务完成。 - **CyclicBarrier**:允许多个线程互相等待到达某个点再继续执行。 - **Phaser**:类似CyclicBarrier,但更加灵活,支持动态调整参与线程数。 4. ...
- **CopyOnWriteArrayList/CopyOnWriteArraySet**:写时复制策略,读操作无锁,写操作复制整个数组,适合读多写少的场景。 5. **线程池**: - **ExecutorService**:Java并发框架的一部分,提供线程池服务,可以...
CountDownLatch 闭锁 AQS 锁的公共类 20180514 String, 部分Character 20180508 除 Set 外, 常用的 Collection 都已经分析完毕 简化语言描述, 增加测试用例(实践用法) 接触到新的类再看源码(不能脱离实际场景瞎看, ...
- `CyclicBarrier`和`CountDownLatch`: 同步辅助类,允许一组线程等待其他线程到达某个点后继续执行。 - `Semaphore`:信号量,控制同时访问特定资源的线程数量。 4. **并发集合** - `ConcurrentHashMap`: 并发...
基于JDK源码解析Java并发锁,我们需要关注以下几个关键知识点: 1. **AQS(AbstractQueuedSynchronizer)基础同步器**: AQS是一个用于构建锁和同步器的框架,它维护了一个FIFO的等待队列,提供了两种模式:独占和...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
ReentrantReadWriteLock是读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 7. 线程池:Java提供了ExecutorService和ThreadPoolExecutor等工具来管理线程池,线程池可以有效控制运行的线程数量...
14. **并发编程**:Java并发库如ExecutorService、Future、Callable等的使用,以及并发工具类如Semaphore、CountDownLatch等。 15. **Lambda表达式与函数式编程**:Java 8引入的Lambda表达式和Stream API,让代码更...
- **读写锁**:`ReentrantReadWriteLock`允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 3. **并发工具类** - **Future和Callable**:`Future`代表异步计算的结果,`Callable`定义了计算任务,它们...
- 并发读操作通常是安全的,因为读操作不会改变文件内容。但并发写操作需要特别注意,一般需要使用互斥锁或者文件通道的原子操作来确保写操作的顺序。 3. **文件锁(File Locking)**: - 在Java中,`java.nio....
这种方式保证了读操作的高性能,但写操作相对较慢,适用于读多写少的场景。 3. **BlockingQueue**:阻塞队列是一种特殊类型的线程安全队列,它支持阻塞的插入(put)和移除(take)操作。常见的实现有...
合理使用并发工具类,如`Semaphore`, `CountDownLatch`等;避免过度优化,考虑实际应用场景。 5. **源码分析** - 学习Java的线程模型,如JVM如何调度线程,可以阅读JDK源码中`java.lang.Thread`和`java.lang....
此外,还可以使用Semaphore信号量、CountDownLatch倒计时锁、CyclicBarrier同步屏障等工具类。 以上是部分Java多线程设计模式的概述,每个模式都有其适用场景和优缺点。实际开发中,开发者应根据需求选择合适的模式...