關于Java的Condition接口最佳理解方式
Condition就是實現(xiàn)了管程里面的條件變量。
Java 語言內置的管程里只有一個條件變量,而Lock&Condition實現(xiàn)的管程支持多個條件變量。 支持多個條件變量,能讓代碼可讀性更好,實現(xiàn)也更容易。
例如,你看我這里實現(xiàn)一個阻塞隊列,就需要兩個條件變量:
- 隊列不空 空隊列自然沒有元素能出隊隊列不滿
- 隊列已滿,當然也不可有元素再入隊

Lock和Condition實現(xiàn)的管程,線程等待和通知需要調用await()、signal()、signalAll(),它們的語義和wait()、notify()、notifyAll()相同。
- Lock&Condition實現(xiàn)的管程里只能使用await()、signal()、signalAll()
- synchronized實現(xiàn)的管程才能使用wait()、notify()、notifyAll()
如果在Lock&Condition實現(xiàn)的管程里調用wait()、notify()、notifyAll(),你距離離職就更近一步了。
Thread.sleep() V.S Condition.await()
Object.wait()和Condition.await()的原理是基本一致的,不同在于Condition.await()底層是調用LockSupport.park()實現(xiàn)阻塞當前線程。它在阻塞當前線程前,其實還做了:
- 把當前線程添加到條件隊列
- 完全釋放鎖,即讓state=0,然后才調用
LockSupport.park()阻塞當前線程
JDK的Lock和Condition不過就是管程的一種實現(xiàn),一般如何使用呢?
什么是同步與異步?
- 同步 調用方需要等待結果
- 異步 不需要等待結果
代碼里如何實現(xiàn)異步?
- 調用方創(chuàng)建一個子線程,在子線程中執(zhí)行方法調用,即異步調用
- 方法實現(xiàn)時,創(chuàng)建一個新的線程執(zhí)行主要邏輯,主線程直接return,即異步方法。
異步場景挺多,比如TCP協(xié)議本身是異步的,日常的RPC調用,在TCP協(xié)議層面,發(fā)送完RPC請求后,線程不會等待RPC響應結果。
是不是好奇了,明明日常使用的RPC調用都是同步的呀?這到底是同步還是異步?
這肯定有人幫忙實現(xiàn)了異步轉同步。比如RPC框架Dubbo,具體它是怎么做到的呢?
對于下面一個簡單的RPC調用,默認情況下sayHello()是個同步方法,即執(zhí)行service.sayHello(“dubbo”)時,線程會停下來等結果。
DemoService service = 初始化部分省略
String message = service.sayHello("dubbo");
System.out.println(message);若此時dump調用線程的調用棧

發(fā)現(xiàn)調用線程阻塞了,線程狀態(tài)是TIMED_WAITING。本來發(fā)送請求是異步的,但是調用線程卻阻塞了,說明Dubbo幫我們做了異步轉同步的事情。通過調用??吹骄€程是阻塞在DefaultFuture.get(),所以Dubbo異步轉同步的功能應該是通過DefaultFuture實現(xiàn)。
DefaultFuture.get()之前發(fā)生了什么呢:

我們的期望:
RPC返回結果前,阻塞調用線程,讓調用線程等待
RPC返回結果后,喚醒調用線程,讓調用線程重新執(zhí)行
這就是經典的等待-通知機制,即管程的實現(xiàn)方案。
- 看看Dubbo是怎么實現(xiàn)的。

到此這篇關于關于Java的Condition接口最佳理解方式的文章就介紹到這了,更多相關Java的Condition接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中List轉Map的幾種具體實現(xiàn)方式和特點
這篇文章主要介紹了幾種常用的List轉Map的方式,包括使用for循環(huán)遍歷、Java8StreamAPI、ApacheCommonsCollections和GoogleGuava,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-01-01
Spring Boot集成LangChain來實現(xiàn)Rag應用的問題小結
檢索增強生成(RAG)是一種優(yōu)化大型語言模型(LLM)輸出的技術,通過引用權威知識庫以增強模型的準確性和相關性,RAG允許LLM在不重新訓練的情況下訪問特定領域的知識,提高了其在各種應用中的實用性和信任度,感興趣的朋友跟隨小編一起看看吧2024-09-09
Springboot?No?bean?named?'XXXXX'?available?問
這篇文章主要介紹了Springboot?No?bean?named?'XXXXX'?available?問題解決方法,解決方法也很簡單,盡量規(guī)范類的命名,注解中指定bean名稱,本文給大家介紹的非常詳細,需要的朋友可以參考下2023-07-07

