併發程式設計5

2022-08-29 13:03:24 字數 1017 閱讀 2690

阻塞與非阻塞

阻塞:程式遇到io操作,導致**無法繼續執行,交出cpu執行權

非阻塞:沒有io操作或者遇到io操作也不阻塞**執行

寫程式時要儘量減少io操作

同步與非同步

同步:發起乙個任務後,必須原地等待任務執行結束,拿到乙個明確的結果

非同步:發起乙個任務後,不需要等待,**繼續往下執行

非同步任務的效率高於同步

非同步任務使用場景:當你的任務是不需要立即獲得結果的並且還有其他的任務需要處理

發起非同步任務的方式:多程序,多執行緒

同步和阻塞的區別:

阻塞一定意味著cpu切走了,而同步有可能是計算任務耗時較長

非同步**

給非同步任務繫結乙個函式,當任務完成時會自動呼叫該函式

當你往程序池或執行緒池物件中新增了乙個非同步任務,會返回乙個表示結果的物件

有乙個物件繫結方法add_done_callback,需要乙個函式作為引數

注意:**函式必須有且僅有乙個引數,就是物件本身通過物件.result來獲取結果

**函式交給子執行緒來執行,

優點:不會原地等待,任務結束可以立即獲取結果

執行緒佇列

queue該模組下提供了一些常用的資料容器但是它們僅僅時容器沒有資料共享的特點

queue:先進先出

lifoqueue:先進後出

priorityqueue:傳入乙個元組,第乙個值是優先順序,第二個值是值

事件是乙個通知訊息,表示什麼時間發生了什麼事

用於執行緒間通訊

執行緒之間,執行流程是獨立的,一些時候可能需要知道另乙個執行緒發生了什麼

事件就是幫你維護了乙個bool值

在bool為true之前,wait函式將一直阻塞

協程乙個單執行緒併發執行多個任務

用於提高效率,在檢測到io操作時,切換到其他的非io操作

程式在作業系統眼中依然沒有阻塞

greenlet 是對yield進行了封裝,簡化了書寫但他不能檢測io操作

gevent可在單執行緒實現併發,又可以檢測io操作

Java併發程式設計 5 活性

不正確的使用互斥技術會導致各種活性問題。所謂程式活性是指併發應用程式能夠按時完成動作的能力。常見活性問題主要有死鎖 deadlock 飢餓 starvation 和活鎖 livelock 死鎖 死鎖是指多個執行緒為競爭某些共享資源而陷入無限等待狀態。假如有條禮貌規則是,當你向朋友鞠躬時,你要一直彎著...

《Java併發程式設計實戰》 5

每當看到new thread runnable start 時,並且你希望獲得一種更靈活的執行策略時,請考慮使用excecutor來代替thread。completionservice將execute和blockingqueue的功能融合在一起。executorcompletionservice實現...

併發程式設計5 單例

餓漢式單例模式 不會出現執行緒安全模式 public class singletonhunger 類載入時就產生了instance物件 private static singletonhunger instance new singletonhunger public static singleto...