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