您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“ wait、notify、notifyAll有什么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學習一下“ wait、notify、notifyAll有什么用”這篇文章吧。
一:wait、notify、notifyAll簡單介紹
1. 為什么
wait、notify、notifyAll 不是線程對象Thread的方法
原因:首先應(yīng)該明確wait、notify、notifyAll三個方法都是對鎖對象的操作,而鎖可以是任何對象。在java的世界中任何對象都屬于Object類,因此這三個方法都是Object的方法, 而不是線程對象Thread的方法。
2. 使用方法需要注意兩點:
a. 這三個方法必須在synchronized關(guān)鍵字包含的臨界區(qū)(簡單理解,就是代碼塊)內(nèi)使用;
b. 使用方式為鎖對象.方法(),比如obj.wait();
3. 什么時候加鎖、什么時候釋放鎖?必須明確以下幾點:
a. notify和notifyAll方法不會釋放鎖,這兩個方法只是通知其他使用該鎖當鎖但是在wait狀態(tài)的線程,可以準備搶鎖了(注:這里還要格外注意一點,其他使用該鎖當鎖且處于wait狀態(tài)的線程只有被notify或notifyAll喚醒了,才有資格搶鎖)
b. 某個鎖對象調(diào)用wait方法會立即釋放當前線程的該對象鎖 , 且其他線程通過
notify/notifyAll方法通知該線程可以搶該對象鎖時,如果當前線程搶到了,會從當前鎖的wait方法之后開始執(zhí)行 — 即從哪里wait,從哪里執(zhí)行;
c. 在synchronized、wait、notify、notifyAll的組合里加鎖的方式只有一個即進入同步代碼塊時加鎖;
釋放鎖的方式有兩個: ①鎖對象調(diào)用wait方法時會釋放鎖 ;② 走完同步代碼塊時自動釋放鎖
4. notify、notifyAll的區(qū)別
a. 某個鎖對象的notify只會喚醒一個使用該鎖當鎖且處于wait狀態(tài)的線程;
b. 某個鎖對象的notifyAll方法會把所有使用該鎖當鎖且處于wait狀態(tài)的線程都喚醒;
使用建議: 為了防止某些線程無法被通知到,建議都使用notifyAll。
以上是“ wait、notify、notifyAll有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。