JAVA-初步認識-第十四章-多線程-wait和sleep的區別
一.
wait和sleep的方法有些類似,我們現在要對其進行描述,區分它們。
wait方法在object類中,而且有兩種形式,分別是wait()和wait(long timeout),我們關註後者。
參數的截圖中表明wait方法可以醒。
等待和睡眠的區別,睡眠是可以醒過來的,但是等待有可能是無休止的。
兩者一個是object方法,一個是thread方法。
sleep能不醒,不需要被人叫。sleep拿著鎖,別人進不來。
現在講述一些有趣的,可能顛覆以往的概念。
這兩個是同一個鎖,t0,t1,t2三個線程全部沖入show方法,全部都臥倒了。t0拿到鎖this,進入同步代碼塊,就wait了。一wait就等在這兒了,就進入線程池了,接著就釋放執行權了,也釋放鎖了。因為在另外的method方法中,有可能有notify,要不然t4怎麽救t0~t2,
t0一掛,t1,t2,t4就搶執行權了。t1拿到執行權和鎖,進來後也wait了,同樣的t2也會掛在這。
現在要說的是這個問題,t4進來,notifyAll,上面的三個線程全都活了。這就有問題,在同步中,某一個時刻只能有一個線程執行,現在有三個在裏面活著,怎麽辦?
在外面進不來就安全了,現在都進來了,這下面還有共性代碼,多條語句,這三個線程一操作就掛了,
三個線程都活著,都在等待著執行權,cpu如果切換到t0上,這時候t0也不見得就運行。因為這上下的所有線程都在同步當中,在同步當中,你想要運行,得具備一個資格,你得持有鎖。t4一個notifyAll,上面三個線程都活了,只能說明它們都具備了資格,但是t4還拿著鎖呢?t4還沒出來呢,t4從同步中一出來,鎖就放了。這一放,上面三個線程就有一個切到執行權上,它就會獲得鎖。如果t0獲得鎖了,它就執行,這時t1和t2是不可能執行的,除非t0出去,否則它們執行不了。
同步裏面一個時刻只能有一個線程能夠執行,但是活的線程不止一個。誰拿鎖誰執行。
JAVA-初步認識-第十四章-多線程-wait和sleep的區別