wait,notify,notifyAll用法解析

2021-08-04 13:15:09 字數 1000 閱讀 1764

在併發開發中,鎖是非常常見的,而wait/notify也經常會和鎖一起使用,例如在生產者消費者模式中。而且wait/notify也必須和鎖一起使用,因為它們都是基於物件的,否則會丟擲異常。

下面,我們通過一段簡單的**,來了解以下wait/notify的用法:

public

class

waitnotifytest catch (interruptedexception e)

}system.out.println(thread.currentthread().getname()+"執行完成");}}

public

static

void main(string args) throws interruptedexception

thread.sleep(100);

synchronized (final_object)

}}

執行結果如下:

thread-2進入wait

thread-4進入wait

thread-3進入wait

thread-2執行完成

我們發現,執行緒2執行完成之後,執行緒3和執行緒4還是繼續會等待,所以notify方法只會喚醒乙個進入wait的執行緒,並且是第乙個進入的。如果使用notifyall,執行結果如下:

thread-2進入wait

thread-3進入wait

thread-4進入wait

thread-4執行完成

thread-2執行完成

thread-3執行完成

由此我們可以分析出:使用notifyall會將所有的執行緒都喚醒,喚醒之後,誰先獲取到cpu資源,誰就先執行,所以這三個執行緒的執行順序出現了變化。

而且,通過以上**,我們可以知道wait的乙個特性:當執行緒進入wait狀態時,該執行緒會將鎖資源釋放,其他的執行緒就可以進來,而當它再次被喚醒時,就可以再次去搶奪鎖資源了。

python add argument 用法解析

argparse argparse 是 python 內建的乙個用於命令項選項與引數解析的模組,通過在程式中定義好我們需要的引數,argparse 將會從 sys.ar 中解析出這些引數,並自動生成幫助和使用資訊。當然,python 也有第三方的庫可用於命令列解析,而且功能也更加強大,比如 doco...

Docker Dockerfile用法全解析

dockerfile基本的指令 from workdir copy 本地目錄移動 add url目錄等 run 映象構建執行shell 語句 cmd 容器執行執行的shell 語句 entrypoint docker inspect nginx latest 檢視nginx的一些配置資訊,發現指定了...

memset函式用法精解

需要的標頭檔案 在c中 在c 中 void memset void s,int ch,size t n 函式解釋 將s中後n個位元組 typedef unsigned int size t 用ch替換並返回s.函式作用 在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快...