日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解Java并發(fā)之Condition

瀏覽:192日期:2022-08-31 15:35:28

在使用Lock之前,我們使用的最多的同步方式應(yīng)該是synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)同步方式了。配合Object的wait()、notify()系列方法可以實(shí)現(xiàn)等待/通知模式。Condition接口也提供了類(lèi)似Object的監(jiān)視器方法,與Lock配合可以實(shí)現(xiàn)等待/通知模式,但是這兩者在使用方式以及功能特性上還是有差別的。Object和Condition接口的一些對(duì)比。摘自《Java并發(fā)編程的藝術(shù)》

詳解Java并發(fā)之Condition

一、Condition接口介紹和示例

首先我們需要明白condition對(duì)象是依賴(lài)于lock對(duì)象的,意思就是說(shuō)condition對(duì)象需要通過(guò)lock對(duì)象進(jìn)行創(chuàng)建出來(lái)(調(diào)用Lock對(duì)象的newCondition()方法)。consition的使用方式非常的簡(jiǎn)單。但是需要注意在調(diào)用方法前獲取鎖。

package com.ydl.test.juc;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ConditionUseCase { public Lock lock = new ReentrantLock(); public Condition condition = lock.newCondition(); public static void main(String[] args) { ConditionUseCase useCase = new ConditionUseCase(); ExecutorService executorService = Executors.newFixedThreadPool (2); executorService.execute(new Runnable() { @Override public void run() {useCase.conditionWait(); } }); executorService.execute(new Runnable() { @Override public void run() {useCase.conditionSignal(); } }); } public void conditionWait() { lock.lock(); try { System.out.println(Thread.currentThread().getName() + '拿到鎖了'); System.out.println(Thread.currentThread().getName() + '等待信號(hào)'); condition.await(); System.out.println(Thread.currentThread().getName() + '拿到信號(hào)'); }catch (Exception e){ }finally { lock.unlock(); } } public void conditionSignal() { lock.lock(); try { Thread.sleep(5000); System.out.println(Thread.currentThread().getName() + '拿到鎖了'); condition.signal(); System.out.println(Thread.currentThread().getName() + '發(fā)出信號(hào)'); }catch (Exception e){ }finally { lock.unlock(); } }}

pool-1-thread-1拿到鎖了pool-1-thread-1等待信號(hào)pool-1-thread-2拿到鎖了pool-1-thread-2發(fā)出信號(hào)pool-1-thread-1拿到信號(hào)

如示例所示,一般都會(huì)將Condition對(duì)象作為成員變量。當(dāng)調(diào)用await()方法后,當(dāng)前線(xiàn)程會(huì)釋放鎖并在此等待,而其他線(xiàn)程調(diào)用Condition對(duì)象的signal()方法,通知當(dāng)前線(xiàn)程后,當(dāng)前線(xiàn)程才從await()方法返回,并且在返回前已經(jīng)獲取了鎖。

二、Condition接口常用方法

condition可以通俗的理解為條件隊(duì)列。當(dāng)一個(gè)線(xiàn)程在調(diào)用了await方法以后,直到線(xiàn)程等待的某個(gè)條件為真的時(shí)候才會(huì)被喚醒。這種方式為線(xiàn)程提供了更加簡(jiǎn)單的等待/通知模式。Condition必須要配合鎖一起使用,因?yàn)閷?duì)共享狀態(tài)變量的訪(fǎng)問(wèn)發(fā)生在多線(xiàn)程環(huán)境下。一個(gè)Condition的實(shí)例必須與一個(gè)Lock綁定,因此Condition一般都是作為L(zhǎng)ock的內(nèi)部實(shí)現(xiàn)。

await() :造成當(dāng)前線(xiàn)程在接到信號(hào)或被中斷之前一直處于等待狀態(tài)。

await(long time, TimeUnit unit) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定等待時(shí)間之前一直處于等待狀態(tài)。

awaitNanos(long nanosTimeout) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定等待時(shí)間之前一直處于等待狀態(tài)。返回值表示剩余時(shí)間,如果在nanosTimesout之前喚醒,那么返回值 = nanosTimeout - 消耗時(shí)間,如果返回值 <= 0 ,則可以認(rèn)定它已經(jīng)超時(shí)了。

awaitUninterruptibly() :造成當(dāng)前線(xiàn)程在接到信號(hào)之前一直處于等待狀態(tài)。【注意:該方法對(duì)中斷不敏感】。

awaitUntil(Date deadline) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定最后期限之前一直處于等待狀態(tài)。如果沒(méi)有到指定時(shí)間就被通知,則返回true,否則表示到了指定時(shí)間,返回返回false。

signal() :?jiǎn)拘岩粋€(gè)等待線(xiàn)程。該線(xiàn)程從等待方法返回前必須獲得與Condition相關(guān)的鎖。

signal()All :?jiǎn)拘阉械却€(xiàn)程。能夠從等待方法返回的線(xiàn)程必須獲得與Condition相關(guān)的鎖。

三、Condition接口原理簡(jiǎn)單解析

Condition是AQS的內(nèi)部類(lèi)。每個(gè)Condition對(duì)象都包含一個(gè)隊(duì)列(等待隊(duì)列)。等待隊(duì)列是一個(gè)FIFO的隊(duì)列,在隊(duì)列中的每個(gè)節(jié)點(diǎn)都包含了一個(gè)線(xiàn)程引用,該線(xiàn)程就是在Condition對(duì)象上等待的線(xiàn)程,如果一個(gè)線(xiàn)程調(diào)用了Condition.await()方法,那么該線(xiàn)程將會(huì)釋放鎖、構(gòu)造成節(jié)點(diǎn)加入等待隊(duì)列并進(jìn)入等待狀態(tài)。等待隊(duì)列的基本結(jié)構(gòu)如下所示。

詳解Java并發(fā)之Condition

等待分為首節(jié)點(diǎn)和尾節(jié)點(diǎn)。當(dāng)一個(gè)線(xiàn)程調(diào)用Condition.await()方法,將會(huì)以當(dāng)前線(xiàn)程構(gòu)造節(jié)點(diǎn),并將節(jié)點(diǎn)從尾部加入等待隊(duì)列。新增節(jié)點(diǎn)就是將尾部節(jié)點(diǎn)指向新增的節(jié)點(diǎn)。節(jié)點(diǎn)引用更新本來(lái)就是在獲取鎖以后的操作,所以不需要CAS保證。同時(shí)也是線(xiàn)程安全的操作。

3.2、等待

當(dāng)線(xiàn)程調(diào)用了await方法以后。線(xiàn)程就作為隊(duì)列中的一個(gè)節(jié)點(diǎn)被加入到等待隊(duì)列中去了。同時(shí)會(huì)釋放鎖的擁有。當(dāng)從await方法返回的時(shí)候。一定會(huì)獲取condition相關(guān)聯(lián)的鎖。當(dāng)?shù)却?duì)列中的節(jié)點(diǎn)被喚醒的時(shí)候,則喚醒節(jié)點(diǎn)的線(xiàn)程開(kāi)始嘗試獲取同步狀態(tài)。如果不是通過(guò) 其他線(xiàn)程調(diào)用Condition.signal()方法喚醒,而是對(duì)等待線(xiàn)程進(jìn)行中斷,則會(huì)拋出InterruptedException異常信息。

3.3、通知

調(diào)用Condition的signal()方法,將會(huì)喚醒在等待隊(duì)列中等待最長(zhǎng)時(shí)間的節(jié)點(diǎn)(條件隊(duì)列里的首節(jié)點(diǎn)),在喚醒節(jié)點(diǎn)前,會(huì)將節(jié)點(diǎn)移到同步隊(duì)列中。當(dāng)前線(xiàn)程加入到等待隊(duì)列中如圖所示:

詳解Java并發(fā)之Condition

在調(diào)用signal()方法之前必須先判斷是否獲取到了鎖。接著獲取等待隊(duì)列的首節(jié)點(diǎn),將其移動(dòng)到同步隊(duì)列并且利用LockSupport喚醒節(jié)點(diǎn)中的線(xiàn)程。節(jié)點(diǎn)從等待隊(duì)列移動(dòng)到同步隊(duì)列如下圖所示:

詳解Java并發(fā)之Condition

被喚醒的線(xiàn)程將從await方法中的while循環(huán)中退出。隨后加入到同步狀態(tài)的競(jìng)爭(zhēng)當(dāng)中去。成功獲取到競(jìng)爭(zhēng)的線(xiàn)程則會(huì)返回到await方法之前的狀態(tài)。

四、總結(jié)

調(diào)用await方法后,將當(dāng)前線(xiàn)程加入Condition等待隊(duì)列中。當(dāng)前線(xiàn)程釋放鎖。否則別的線(xiàn)程就無(wú)法拿到鎖而發(fā)生死鎖。自旋(while)掛起,不斷檢測(cè)節(jié)點(diǎn)是否在同步隊(duì)列中了,如果是則嘗試獲取鎖,否則掛起。當(dāng)線(xiàn)程被signal方法喚醒,被喚醒的線(xiàn)程將從await()方法中的while循環(huán)中退出來(lái),然后調(diào)用acquireQueued()方法競(jìng)爭(zhēng)同步狀態(tài)。

五、利用Condition實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式

import java.util.LinkedList;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class BoundedQueue { private LinkedList<Object> buffer; //生產(chǎn)者容器 private int maxSize ; //容器最大值是多少 private Lock lock; private Condition fullCondition; private Condition notFullCondition; BoundedQueue(int maxSize){ this.maxSize = maxSize; buffer = new LinkedList<Object>(); lock = new ReentrantLock(); fullCondition = lock.newCondition(); notFullCondition = lock.newCondition(); } /** * 生產(chǎn)者 * @param obj * @throws InterruptedException */ public void put(Object obj) throws InterruptedException { lock.lock(); //獲取鎖 try { while (maxSize == buffer.size()){notFullCondition.await(); //滿(mǎn)了,添加的線(xiàn)程進(jìn)入等待狀態(tài) } buffer.add(obj); fullCondition.signal(); //通知 } finally { lock.unlock(); } } /** * 消費(fèi)者 * @return * @throws InterruptedException */ public Object get() throws InterruptedException { Object obj; lock.lock(); try { while (buffer.size() == 0){ //隊(duì)列中沒(méi)有數(shù)據(jù)了 線(xiàn)程進(jìn)入等待狀態(tài)fullCondition.await(); } obj = buffer.poll(); notFullCondition.signal(); //通知 } finally { lock.unlock(); } return obj; }}

以上就是詳解Java并發(fā)之Condition的詳細(xì)內(nèi)容,更多關(guān)于Java并發(fā)Condition的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品青草| 久久国产66| 免费人成黄页网站在线一区二区| 国产精品二区不卡| 国产精品s色| 日韩精品乱码av一区二区| 欧美日韩高清| 久久久久91| 国产美女高潮在线观看| 欧美激情麻豆| 免费美女久久99| 欧美性感美女一区二区| 欧美不卡视频| 国产一区日韩一区| 亚洲精品一二三区区别| 免费日韩一区二区| 日韩欧美久久| 国产探花在线精品一区二区| 国产精品videossex久久发布| 成人在线视频免费看| 久久免费高清| 99riav1国产精品视频| 亚洲无线观看| 国产日韩在线观看视频| 日本久久精品| 亚洲精品极品少妇16p| 中文字幕一区二区av| 国产日本精品| 国精品产品一区| 欧美日韩免费观看视频| 亚洲精品一区二区在线看| 丝袜a∨在线一区二区三区不卡| 日韩精品免费观看视频| 你懂的亚洲视频| 久久婷婷激情| 一区二区国产在线| 国产精品久一| 激情久久婷婷| 91精品视频一区二区| 国产一区二区精品福利地址| 免费成人网www| 日韩黄色在线观看| 色婷婷亚洲mv天堂mv在影片| 国产综合亚洲精品一区二| 老色鬼久久亚洲一区二区| 欧美一级网址| 日韩精品1区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲美女久久| 精品国产a一区二区三区v免费| 欧美色图国产精品| 日韩精品导航| www.com.cn成人| 免费人成精品欧美精品| 精品视频自拍| 免费在线看一区| 欧美国产极品| 久久av在线| 国产第一亚洲| 亚洲精品自拍| 日韩精品dvd| 日本在线一区二区三区| 日韩欧美午夜| 69堂精品视频在线播放| 99精品视频精品精品视频| 日韩高清不卡一区二区| 久久久久中文| 日本欧美一区二区| 欧美sss在线视频| 国产欧美久久一区二区三区| 在线一区电影| 久久中文在线| 丝袜美腿亚洲色图| 九九色在线视频| 欧美日本不卡高清| 日韩午夜av在线| 91嫩草亚洲精品| 国产欧美一级| 免费观看在线综合| 日韩精品午夜| 精品视频自拍| 日韩毛片网站| 天堂va蜜桃一区二区三区| se01亚洲视频| 国产精品对白| 天堂精品久久久久| 亚洲婷婷在线| 日本精品黄色| 美女视频网站久久| 午夜久久av | 最新中文字幕在线播放| 日本成人手机在线| 久久电影一区| 久久激情一区| 欧美日韩国产观看视频| 国产精品一区二区精品| 亚洲精品综合| 国产精品嫩草99av在线| 国产91一区| 日韩精品91| caoporn视频在线| 另类欧美日韩国产在线| 日韩一二三区在线观看| 免费观看在线综合| av成人国产| 午夜欧美精品| 欧美成人午夜| 99精品视频在线| av一区在线| 色婷婷久久久| 日韩欧美精品一区| 国产精品久久观看| 成人一二三区| 国产精品高颜值在线观看| 日韩av二区| 中文字幕在线官网| 欧美国产小视频| 成人三级高清视频在线看| 首页国产精品| 国产高潮在线| 久久久久久一区二区| 日产精品一区二区| 福利精品在线| 久久久久久一区二区| 精品精品99| 精品一区二区三区免费看 | 综合欧美精品| 视频一区中文字幕精品| 日韩**一区毛片| 国产视频网站一区二区三区| 911亚洲精品| 久久99精品久久久野外观看| 精品精品久久| 欧美成a人免费观看久久| 精品亚洲美女网站| 影视先锋久久| 午夜在线精品| 日韩精品一区二区三区免费视频| 欧美日韩午夜| 国产精品99久久免费观看| 国产精品久久久久久妇女| 久久精品国产亚洲aⅴ| 国产乱码午夜在线视频| 久久人人88| 一区二区电影在线观看| 国产精品视频一区视频二区| 国产精品麻豆成人av电影艾秋| 国产不卡精品| 九九在线精品| 亚洲视频二区| 国产精品亚洲欧美一级在线| 国产激情在线播放| 亚洲成人精选| 日本综合精品一区| 麻豆精品在线视频| 涩涩av在线| 首页亚洲欧美制服丝腿| 久久激情五月婷婷| 欧美韩日一区| 亚洲欧美日韩精品一区二区| 日本不卡在线视频| 成人午夜在线| 国产精品嫩草99av在线| 国产亚洲电影| 五月激情久久| 综合五月婷婷| 国产一区二区三区四区二区| 亚洲精品888| 亚洲精品动态| 麻豆成人综合网| 狠狠久久婷婷| 国产精品美女在线观看直播| 欧美亚洲精品在线| 色综合视频一区二区三区日韩 | 午夜久久tv| 久久国产婷婷国产香蕉| 日韩国产一区| 亚洲精品三级| av中文资源在线资源免费观看| 亚洲女人av| 久久亚州av| 国产精品毛片在线看| 免费日本视频一区| 丰满少妇一区| 中文精品电影| 国产精品二区不卡| 亚洲精品少妇| 日韩精品一区二区三区免费观影| 亚洲我射av| 日韩国产欧美一区二区| 日韩精品1区2区3区| 中文字幕人成乱码在线观看| 美女久久网站| 蜜桃视频在线网站| 91精品福利观看| 欧美一区二区性| 国产精品99久久免费观看| 成人av动漫在线观看| 久久97视频| 亚洲精品福利|