摘要:前置文章为,如果不了解的基本和实现机制,建议先看一下这个文章。类似于和,常用于实现生产者消费者。以下代码是一个用的做的一个生产者消费者例子。
前置文章为https://segmentfault.com/a/11...,如果不了解AQS的基本lock和unlock实现机制,建议先看一下这个文章。
Condition类似于wait和notify,notifyAll,常用于实现生产者消费者。以下代码是一个用ReentrantLock的condition做的一个生产者消费者例子。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class BoundedBuffer { final Lock lock = new ReentrantLock(); // condition 依赖于 lock 来产生 final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; // 生产 public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); // 队列已满,等待,直到 not full 才能继续生产 items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); // 生产成功,队列已经 not empty 了,发个通知出去 } finally { lock.unlock(); } } // 消费 public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); // 队列为空,等待,直到队列 not empty,才能继续消费 Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); // 被我消费掉一个,队列 not full 了,发个通知出去 return x; } finally { lock.unlock(); } } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68025.html
摘要:关于接口的介绍,可以参见多线程进阶二锁框架接口。最终线程释放了锁,并进入阻塞状态。当线程被通知唤醒时,则是将条件队列中的结点转换成等待队列中的结点,之后的处理就和独占功能完全一样。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首发于一世流云的专栏:https://segmentfault.com/bl...
摘要:前言本来准备做源码阅读的几千行看着太累了看了几篇大神的文章后才基本搞懂附在这里阅读本文前请先看懂的介绍和原理分析并发包源码学习之框架四源码分析接口实现接口一般看一个类实现的接口可以看出它的目的其实也是熟悉的目的主要是替代的方法的它是基于实现 前言 本来准备做AbstractQueuedSynchronizer源码阅读的,几千行看着太累了,看了几篇大神的文章后才基本搞懂,附在这里,阅读本...
摘要:注意是一个假节点,阻塞的节点是作为后面的节点出现的。总之在非公平锁场景下尝试去获取锁,如果获取上了,则置一下状态,并设置自己为独占线程,并支持重入锁功能。方法用于创建一个节点值为当前线程并维护一个双向链表。阻塞了当前线程。 部分段落来自于http://javadoop.com/post/Abst...,他的文章相当不错。 ReentrantLock基于Sync内部类来完成锁。Sync继...
摘要:与之相关的方法有三个原子性地修改都是类型,可见我们可以进行,来定义的获取与释放从而实现我们自定义的同步器。 前言 源码分析我认为主要有两个作用:满足好奇心,我想每一个有追求的人都不会满足于仅仅做一个API Caller实现功能就好,我们也想知道它到底是怎么实现的;借鉴与升华,当我们明白了一个类的设计原理,在一定的情境下我们可以借鉴其设计哲学,甚至针对我们自己特殊的业务场景对其进行改良与...
摘要:与之相关的方法有三个原子性地修改都是类型,可见我们可以进行,来定义的获取与释放从而实现我们自定义的同步器。 前言 源码分析我认为主要有两个作用:满足好奇心,我想每一个有追求的人都不会满足于仅仅做一个API Caller实现功能就好,我们也想知道它到底是怎么实现的;借鉴与升华,当我们明白了一个类的设计原理,在一定的情境下我们可以借鉴其设计哲学,甚至针对我们自己特殊的业务场景对其进行改良与...
阅读 1324·2021-09-10 10:51
阅读 2805·2019-08-30 15:54
阅读 3302·2019-08-29 17:11
阅读 888·2019-08-29 16:44
阅读 1372·2019-08-29 13:47
阅读 1058·2019-08-29 13:47
阅读 1458·2019-08-29 12:23
阅读 1009·2019-08-28 18:18