最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Condition條件變量提高線程通信效率

 更新時(shí)間:2020年10月21日 09:48:11   作者:cuisuqiang  
這篇文章主要介紹了Java Condition條件變量提高線程通信效率,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

條件(也稱為條件隊(duì)列 或條件變量)為線程提供了一個(gè)含義,以便在某個(gè)狀態(tài)條件現(xiàn)在可能為 true 的另一個(gè)線程通知它之前,一直掛起該線程(即讓其“等待”)。因?yàn)樵L問(wèn)此共享狀態(tài)信息發(fā)生在不同的線程中,所以它必須受保護(hù),因此要將某種形式的鎖與該條件相關(guān)聯(lián)。等待提供一個(gè)條件的主要屬性是:以原子方式 釋放相關(guān)的鎖,并掛起當(dāng)前線程,就像 Object.wait 做的那樣

在Condition中,用await()替換wait(),用signal()替換notify(),用signalAll()替換notifyAll(),傳統(tǒng)線程的通信方式,Condition都可以實(shí)現(xiàn)。

條件變量類似JDK1.4或以前版本中的 Object.wait(); Object.notify(); Object.notifyAll();

值得注意的是當(dāng)condition.await()時(shí),隱式的將條件變量關(guān)聯(lián)的Lock解鎖,而使其他線程有機(jī)會(huì)獲得Lock,而檢查條件,并在條件滿足時(shí),等待在條件變量上。

示例代碼,ArrayBlockingQueue源碼摘?。?/p>

/** Main lock guarding all access */
private final ReentrantLock lock;
/** Condition for waiting takes */
private final Condition notEmpty;
/** Condition for waiting puts */
private final Condition notFull;
/**
 * Inserts the specified element at the tail of this queue, waiting
 * for space to become available if the queue is full.
 *
 * @throws InterruptedException {@inheritDoc}
 * @throws NullPointerException {@inheritDoc}
 */
public void put(E e) throws InterruptedException {
 if (e == null) throw new NullPointerException();
 final E[] items = this.items;
 final ReentrantLock lock = this.lock;
 lock.lockInterruptibly();
 try {
 try {
  while (count == items.length)
  notFull.await();
 } catch (InterruptedException ie) {
  notFull.signal(); // propagate to non-interrupted thread
  throw ie;
 }
 insert(e);
 } finally {
 lock.unlock();
 }
}
public E take() throws InterruptedException {
 final ReentrantLock lock = this.lock;
 lock.lockInterruptibly();
 try {
 try {
  while (count == 0)
  notEmpty.await();
 } catch (InterruptedException ie) {
  notEmpty.signal(); // propagate to non-interrupted thread
  throw ie;
 }
 E x = extract();
 return x;
 } finally {
 lock.unlock();
 }
}

有多個(gè)線程往里面存數(shù)據(jù)和從里面取數(shù)據(jù),其隊(duì)列(先進(jìn)先出后進(jìn)后出)能緩存的最大數(shù)值是capacity,多個(gè)線程間是互斥的,當(dāng)緩存隊(duì)列中存儲(chǔ)的值達(dá)到capacity時(shí),將寫線程阻塞,并喚醒讀線程,當(dāng)緩存隊(duì)列中存儲(chǔ)的值為0時(shí),將讀線程阻塞,并喚醒寫線程
這就是多個(gè)Condition的強(qiáng)大之處,假設(shè)緩存隊(duì)列中已經(jīng)存滿,那么阻塞的肯定是寫線程,喚醒的肯定是讀線程,相反,阻塞的肯定是讀線程,喚醒的肯定是寫線程,那么假設(shè)只有一個(gè)Condition會(huì)有什么效果呢,緩存隊(duì)列中已經(jīng)存滿,這個(gè)Lock不知道喚醒的是讀線程還是寫線程了,如果喚醒的是讀線程,皆大歡喜,如果喚醒的是寫線程,那么線程剛被喚醒,又被阻塞了,這時(shí)又去喚醒,這樣就浪費(fèi)了很多時(shí)間!

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java ThreadLocal?類常用方法源碼解析

    java ThreadLocal?類常用方法源碼解析

    這篇文章主要為大家介紹了java ThreadLocal類常用方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 解析阿里一面CyclicBarrier和CountDownLatch的區(qū)別

    解析阿里一面CyclicBarrier和CountDownLatch的區(qū)別

    這篇文章主要介紹了阿里一面CyclicBarrier和CountDownLatch的區(qū)別是啥,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot使用Thymeleaf模板引擎訪問(wèn)靜態(tài)html的過(guò)程

    SpringBoot使用Thymeleaf模板引擎訪問(wèn)靜態(tài)html的過(guò)程

    這篇文章主要介紹了SpringBoot使用Thymeleaf模板引擎訪問(wèn)靜態(tài)html的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法

    在Java Web項(xiàng)目中添加定時(shí)任務(wù)的方法

    在Java Web程序中加入定時(shí)任務(wù),這里介紹兩種方式使用監(jiān)聽(tīng)器注入,使用Spring注解@Scheduled注入,需要的朋友可以參考下
    2018-01-01
  • Spring循環(huán)依賴產(chǎn)生與解決

    Spring循環(huán)依賴產(chǎn)生與解決

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進(jìn)行一下小小的回顧
    2022-12-12
  • Java web實(shí)現(xiàn)動(dòng)態(tài)圖片驗(yàn)證碼的示例代碼

    Java web實(shí)現(xiàn)動(dòng)態(tài)圖片驗(yàn)證碼的示例代碼

    這篇文章主要介紹了Java web實(shí)現(xiàn)動(dòng)態(tài)圖片驗(yàn)證碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java基于UDP協(xié)議的聊天室功能

    Java基于UDP協(xié)議的聊天室功能

    這篇文章主要為大家詳細(xì)介紹了Java基于UDP協(xié)議的聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 劍指Offer之Java算法習(xí)題精講二叉樹(shù)專項(xiàng)解析

    劍指Offer之Java算法習(xí)題精講二叉樹(shù)專項(xiàng)解析

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了HashMap工作原理_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • Idea 解決 Could not autowire. No beans of ''xxxx'' type found 的錯(cuò)誤提示

    Idea 解決 Could not autowire. No beans of ''xxxx'' type found

    這篇文章主要介紹了Idea 解決 Could not autowire. No beans of 'xxxx' type found 的錯(cuò)誤提示,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

图们市| 环江| 杭锦旗| 道真| 邵阳县| 嘉定区| 疏勒县| 甘洛县| 辽源市| 普宁市| 徐水县| 六安市| 博湖县| 交城县| 镇坪县| 新乡市| 湘乡市| 县级市| 上饶县| 虞城县| 开封市| 长寿区| 长垣县| 集贤县| 邯郸县| 姚安县| 荣昌县| 聊城市| 南开区| 伊吾县| 古丈县| 平罗县| 云梦县| 牙克石市| 红原县| 长乐市| 崇礼县| 吉隆县| 阿拉善盟| 兴义市| 虎林市|