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

關(guān)于Java的Condition接口最佳理解方式

 更新時間:2023年05月09日 08:59:17   作者:JavaEdge.  
這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語言內(nèi)置的管程里只有一個條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個條件變量,需要的朋友可以參考下

Condition就是實(shí)現(xiàn)了管程里面的條件變量。

Java 語言內(nèi)置的管程里只有一個條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個條件變量。 支持多個條件變量,能讓代碼可讀性更好,實(shí)現(xiàn)也更容易。

例如,你看我這里實(shí)現(xiàn)一個阻塞隊列,就需要兩個條件變量:

  • 隊列不空 空隊列自然沒有元素能出隊隊列不滿
  • 隊列已滿,當(dāng)然也不可有元素再入隊

Lock和Condition實(shí)現(xiàn)的管程,線程等待和通知需要調(diào)用await()、signal()、signalAll(),它們的語義和wait()、notify()、notifyAll()相同。

  • Lock&Condition實(shí)現(xiàn)的管程里只能使用await()、signal()、signalAll()
  • synchronized實(shí)現(xiàn)的管程才能使用wait()、notify()、notifyAll()

如果在Lock&Condition實(shí)現(xiàn)的管程里調(diào)用wait()、notify()、notifyAll(),你距離離職就更近一步了。

Thread.sleep() V.S Condition.await()

Object.wait()和Condition.await()的原理是基本一致的,不同在于Condition.await()底層是調(diào)用LockSupport.park()實(shí)現(xiàn)阻塞當(dāng)前線程。它在阻塞當(dāng)前線程前,其實(shí)還做了:

  1. 把當(dāng)前線程添加到條件隊列
  2. 完全釋放鎖,即讓state=0,然后才調(diào)用LockSupport.park()阻塞當(dāng)前線程

JDK的Lock和Condition不過就是管程的一種實(shí)現(xiàn),一般如何使用呢?

什么是同步與異步?

  • 同步 調(diào)用方需要等待結(jié)果
  • 異步 不需要等待結(jié)果

代碼里如何實(shí)現(xiàn)異步?

  • 調(diào)用方創(chuàng)建一個子線程,在子線程中執(zhí)行方法調(diào)用,即異步調(diào)用
  • 方法實(shí)現(xiàn)時,創(chuàng)建一個新的線程執(zhí)行主要邏輯,主線程直接return,即異步方法。

異步場景挺多,比如TCP協(xié)議本身是異步的,日常的RPC調(diào)用,在TCP協(xié)議層面,發(fā)送完RPC請求后,線程不會等待RPC響應(yīng)結(jié)果。

是不是好奇了,明明日常使用的RPC調(diào)用都是同步的呀?這到底是同步還是異步?

這肯定有人幫忙實(shí)現(xiàn)了異步轉(zhuǎn)同步。比如RPC框架Dubbo,具體它是怎么做到的呢?

對于下面一個簡單的RPC調(diào)用,默認(rèn)情況下sayHello()是個同步方法,即執(zhí)行service.sayHello(“dubbo”)時,線程會停下來等結(jié)果。

DemoService service = 初始化部分省略
String message = service.sayHello("dubbo");
System.out.println(message);

若此時dump調(diào)用線程的調(diào)用棧

發(fā)現(xiàn)調(diào)用線程阻塞了,線程狀態(tài)是TIMED_WAITING。本來發(fā)送請求是異步的,但是調(diào)用線程卻阻塞了,說明Dubbo幫我們做了異步轉(zhuǎn)同步的事情。通過調(diào)用??吹骄€程是阻塞在DefaultFuture.get(),所以Dubbo異步轉(zhuǎn)同步的功能應(yīng)該是通過DefaultFuture實(shí)現(xiàn)。

DefaultFuture.get()之前發(fā)生了什么呢:

我們的期望:

RPC返回結(jié)果前,阻塞調(diào)用線程,讓調(diào)用線程等待
RPC返回結(jié)果后,喚醒調(diào)用線程,讓調(diào)用線程重新執(zhí)行

這就是經(jīng)典的等待-通知機(jī)制,即管程的實(shí)現(xiàn)方案。

  • 看看Dubbo是怎么實(shí)現(xiàn)的。

到此這篇關(guān)于關(guān)于Java的Condition接口最佳理解方式的文章就介紹到這了,更多相關(guān)Java的Condition接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中List轉(zhuǎn)Map的幾種具體實(shí)現(xiàn)方式和特點(diǎn)

    Java中List轉(zhuǎn)Map的幾種具體實(shí)現(xiàn)方式和特點(diǎn)

    這篇文章主要介紹了幾種常用的List轉(zhuǎn)Map的方式,包括使用for循環(huán)遍歷、Java8StreamAPI、ApacheCommonsCollections和GoogleGuava,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Spring Boot集成LangChain來實(shí)現(xiàn)Rag應(yīng)用的問題小結(jié)

    Spring Boot集成LangChain來實(shí)現(xiàn)Rag應(yīng)用的問題小結(jié)

    檢索增強(qiáng)生成(RAG)是一種優(yōu)化大型語言模型(LLM)輸出的技術(shù),通過引用權(quán)威知識庫以增強(qiáng)模型的準(zhǔn)確性和相關(guān)性,RAG允許LLM在不重新訓(xùn)練的情況下訪問特定領(lǐng)域的知識,提高了其在各種應(yīng)用中的實(shí)用性和信任度,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 基于swing開發(fā)彈幕播放器

    基于swing開發(fā)彈幕播放器

    這篇文章主要為大家詳細(xì)介紹了基于swing實(shí)現(xiàn)彈幕播放器的開發(fā)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • spring狀態(tài)機(jī)模式使用小結(jié)

    spring狀態(tài)機(jī)模式使用小結(jié)

    說起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個狀態(tài)機(jī)和設(shè)計模式中狀態(tài)模式的區(qū)別是啥呢?沒錯,Spring狀態(tài)機(jī)就是狀態(tài)模式的一種實(shí)現(xiàn),在介紹Spring狀態(tài)機(jī)之前,讓我們來看看設(shè)計模式中的狀態(tài)模式,需要的朋友可以參考下
    2024-04-04
  • Springboot?No?bean?named?'XXXXX'?available?問題解決方法

    Springboot?No?bean?named?'XXXXX'?available?問

    這篇文章主要介紹了Springboot?No?bean?named?'XXXXX'?available?問題解決方法,解決方法也很簡單,盡量規(guī)范類的命名,注解中指定bean名稱,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(45)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(45)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Java中的final關(guān)鍵字使用方式

    Java中的final關(guān)鍵字使用方式

    這篇文章主要介紹了Java中的final關(guān)鍵字使用方式,final 關(guān)鍵字用于修飾不可改變內(nèi)容,更多相關(guān)梳理總結(jié),需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • SpringBoot通過請求對象獲取輸入流無數(shù)據(jù)

    SpringBoot通過請求對象獲取輸入流無數(shù)據(jù)

    這篇文章主要介紹了使用SpringBoot通過請求對象獲取輸入流無數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實(shí)現(xiàn)平滑加權(quán)輪詢算法之降權(quán)和提權(quán)詳解

    Java實(shí)現(xiàn)平滑加權(quán)輪詢算法之降權(quán)和提權(quán)詳解

    所有負(fù)載均衡的場景幾乎都會用到這個平滑加權(quán)輪詢算法,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)平滑加權(quán)輪詢算法之降權(quán)和提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • java中下拉框select和單選按鈕的回顯操作

    java中下拉框select和單選按鈕的回顯操作

    這篇文章主要介紹了java中下拉框select和單選按鈕的回顯操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10

最新評論

织金县| 江北区| 甘洛县| 江源县| 和龙市| 四会市| 崇阳县| 永清县| 松溪县| 黔东| 罗江县| 疏附县| 册亨县| 弥渡县| 江山市| 涞源县| 连云港市| 来宾市| 吴桥县| 绥化市| 沙洋县| 交口县| 平度市| 平果县| 同德县| 视频| 东宁县| 牡丹江市| 苍山县| 涟源市| 阳江市| 龙陵县| 榕江县| 会理县| 三原县| 金阳县| 彰武县| 双柏县| 宁南县| 鄯善县| 新竹市|