TShopping

 找回密碼
 註冊
搜索
查看: 138|回復: 0

[教學] java sleep和wait的區別

[複製鏈接]
發表於 2017-8-9 23:02:24 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
sleep方法沒有釋放鎖:不讓出資源
wait方法釋放了鎖:使得其他線程可以使用同步控制塊或者方法

sleep不釋放鎖線程是進入阻塞狀態還是就緒狀態?
sleep是不是還佔著CPU,是互斥還是同步?


首先,要記住這個差別,“sleep是Thread類的方法,wait是Object類中定義的方法”。儘管這兩個方法都會影響線程的執行行為,但是本質上是有區別的。Thread.sleep不會導致鎖行為的改變,如果當前線程是擁有鎖的,那麼Thread.sleep不會讓線程釋放鎖。如果能夠幫助你記憶的話,可以簡單認為和鎖相關的方法都定義在Object類中,因此調用Thread.sleep是不會影響鎖的相關行為。


Thread.sleep和Object.wait都會暫停當前的線程,對於CPU資源來說,不管是哪種方式暫停的線程,都表示它暫時不再需要CPU的執行時間。OS會將執行時間分配給其它線程。


區別是,調用wait後,需要別的線程執行notify/notifyAll才能夠重新獲得CPU執行時間。線程的狀態參考Thread.State的定義。新創建的但是沒有執行(還沒有調用start())的線程處於“就緒”,或者說Thread.State.NEW狀態。


Thread.State.BLOCKED(阻塞)表示線程正在獲取鎖時,因為鎖不能獲取到而被迫暫停執行下面的指令,一直等到這個鎖被別的線程釋放。BLOCKED狀態下線程,OS調度機制需要決定下一個能夠獲取鎖的線程是哪個,這種情況下,就是產生鎖的爭用,無論如何這都是很耗時的操作。

1.jpg

sleep是讓線程進入阻塞狀態,一定時間之後回到非阻塞狀態,從而可以重新獲得CPU。wait調用的時候需要先獲得該Object的鎖,調用wait後,會把當前的鎖釋放掉同時阻塞住;當別的線程調用該Object的notify/notifyAll之後,有可能得到CPU,同時重新獲得鎖。

由於有如上描述鎖的設計,只要在notify的時候首先獲得鎖,就可以保證notify的時候或者處於wait線程獲得鎖之前,或者正在wait,從而保證不會丟掉這次notify信息。


參考文章

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2017-9-25 04:09 , Processed in 0.057272 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表