摘要:前置文章為,如果不了解的基本和實(shí)現(xiàn)機(jī)制,建議先看一下這個(gè)文章。類似于和,常用于實(shí)現(xiàn)生產(chǎn)者消費(fèi)者。以下代碼是一個(gè)用的做的一個(gè)生產(chǎn)者消費(fèi)者例子。
前置文章為https://segmentfault.com/a/11...,如果不了解AQS的基本lock和unlock實(shí)現(xiàn)機(jī)制,建議先看一下這個(gè)文章。
Condition類似于wait和notify,notifyAll,常用于實(shí)現(xiàn)生產(chǎn)者消費(fèi)者。以下代碼是一個(gè)用ReentrantLock的condition做的一個(gè)生產(chǎn)者消費(fèi)者例子。
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 來產(chǎn)生 final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100]; int putptr, takeptr, count; // 生產(chǎn) public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) notFull.await(); // 隊(duì)列已滿,等待,直到 not full 才能繼續(xù)生產(chǎn) items[putptr] = x; if (++putptr == items.length) putptr = 0; ++count; notEmpty.signal(); // 生產(chǎn)成功,隊(duì)列已經(jīng) not empty 了,發(fā)個(gè)通知出去 } finally { lock.unlock(); } } // 消費(fèi) public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) notEmpty.await(); // 隊(duì)列為空,等待,直到隊(duì)列 not empty,才能繼續(xù)消費(fèi) Object x = items[takeptr]; if (++takeptr == items.length) takeptr = 0; --count; notFull.signal(); // 被我消費(fèi)掉一個(gè),隊(duì)列 not full 了,發(fā)個(gè)通知出去 return x; } finally { lock.unlock(); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68025.html
摘要:關(guān)于接口的介紹,可以參見多線程進(jìn)階二鎖框架接口。最終線程釋放了鎖,并進(jìn)入阻塞狀態(tài)。當(dāng)線程被通知喚醒時(shí),則是將條件隊(duì)列中的結(jié)點(diǎn)轉(zhuǎn)換成等待隊(duì)列中的結(jié)點(diǎn),之后的處理就和獨(dú)占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/bl...
摘要:前言本來準(zhǔn)備做源碼閱讀的幾千行看著太累了看了幾篇大神的文章后才基本搞懂附在這里閱讀本文前請先看懂的介紹和原理分析并發(fā)包源碼學(xué)習(xí)之框架四源碼分析接口實(shí)現(xiàn)接口一般看一個(gè)類實(shí)現(xiàn)的接口可以看出它的目的其實(shí)也是熟悉的目的主要是替代的方法的它是基于實(shí)現(xiàn) 前言 本來準(zhǔn)備做AbstractQueuedSynchronizer源碼閱讀的,幾千行看著太累了,看了幾篇大神的文章后才基本搞懂,附在這里,閱讀本...
摘要:注意是一個(gè)假節(jié)點(diǎn),阻塞的節(jié)點(diǎn)是作為后面的節(jié)點(diǎn)出現(xiàn)的??傊诜枪芥i場景下嘗試去獲取鎖,如果獲取上了,則置一下狀態(tài),并設(shè)置自己為獨(dú)占線程,并支持重入鎖功能。方法用于創(chuàng)建一個(gè)節(jié)點(diǎn)值為當(dāng)前線程并維護(hù)一個(gè)雙向鏈表。阻塞了當(dāng)前線程。 部分段落來自于http://javadoop.com/post/Abst...,他的文章相當(dāng)不錯(cuò)。 ReentrantLock基于Sync內(nèi)部類來完成鎖。Sync繼...
摘要:與之相關(guān)的方法有三個(gè)原子性地修改都是類型,可見我們可以進(jìn)行,來定義的獲取與釋放從而實(shí)現(xiàn)我們自定義的同步器。 前言 源碼分析我認(rèn)為主要有兩個(gè)作用:滿足好奇心,我想每一個(gè)有追求的人都不會滿足于僅僅做一個(gè)API Caller實(shí)現(xiàn)功能就好,我們也想知道它到底是怎么實(shí)現(xiàn)的;借鑒與升華,當(dāng)我們明白了一個(gè)類的設(shè)計(jì)原理,在一定的情境下我們可以借鑒其設(shè)計(jì)哲學(xué),甚至針對我們自己特殊的業(yè)務(wù)場景對其進(jìn)行改良與...
摘要:與之相關(guān)的方法有三個(gè)原子性地修改都是類型,可見我們可以進(jìn)行,來定義的獲取與釋放從而實(shí)現(xiàn)我們自定義的同步器。 前言 源碼分析我認(rèn)為主要有兩個(gè)作用:滿足好奇心,我想每一個(gè)有追求的人都不會滿足于僅僅做一個(gè)API Caller實(shí)現(xiàn)功能就好,我們也想知道它到底是怎么實(shí)現(xiàn)的;借鑒與升華,當(dāng)我們明白了一個(gè)類的設(shè)計(jì)原理,在一定的情境下我們可以借鑒其設(shè)計(jì)哲學(xué),甚至針對我們自己特殊的業(yè)務(wù)場景對其進(jìn)行改良與...
閱讀 1371·2021-09-10 10:51
閱讀 2835·2019-08-30 15:54
閱讀 3377·2019-08-29 17:11
閱讀 936·2019-08-29 16:44
閱讀 1399·2019-08-29 13:47
閱讀 1095·2019-08-29 13:47
閱讀 1495·2019-08-29 12:23
閱讀 1052·2019-08-28 18:18