1. 程式人生 > >wait()、notify()和notifyAll()是 Object類 中的方法

wait()、notify()和notifyAll()是 Object類 中的方法

從這三個方法的文字描述可以知道以下幾點資訊:

1)wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。

2)呼叫某個物件的wait()方法能讓當前執行緒阻塞,並且當前執行緒必須擁有此物件的monitor(即鎖)

3)呼叫某個物件的notify()方法能夠喚醒一個正在等待這個物件的monitor的執行緒,如果有多個執行緒都在等待這個物件的monitor,則只能喚醒其中一個執行緒;

4)呼叫notifyAll()方法能夠喚醒所有正在等待這個物件的monitor的執行緒;

有朋友可能會有疑問:為何這三個不是Thread類宣告中的方法,而是Object類中宣告的方法(當然由於Thread類繼承了Object類,所以Thread也可以呼叫者三個方法)?其實這個問題很簡單,由於每個物件都擁有monitor(即鎖),所以讓當前執行緒等待某個物件的鎖,當然應該通過這個物件來操作了。而不是用當前執行緒來操作,因為當前執行緒可能會等待多個執行緒的鎖,如果通過執行緒來操作,就非常複雜了。

上面已經提到,如果呼叫某個物件的wait()方法,當前執行緒必須擁有這個物件的monitor(即鎖),因此呼叫wait()方法必須在同步塊或者同步方法中進行(synchronized塊或者synchronized方法)。

呼叫某個物件的wait()方法,相當於讓當前執行緒交出此物件的monitor,然後進入等待狀態,等待後續再次獲得此物件的鎖(Thread類中的sleep方法使當前執行緒暫停執行一段時間,從而讓其他執行緒有機會繼續執行,但它並不釋放物件鎖);

notify()方法能夠喚醒一個正在等待該物件的monitor的執行緒,當有多個執行緒都在等待該物件的monitor的話,則只能喚醒其中一個執行緒,具體喚醒哪個執行緒則不得而知。

同樣地,呼叫某個物件的notify()方法,當前執行緒也必須擁有這個物件的monitor,因此呼叫notify()方法必須在同步塊或者同步方法中進行(synchronized塊或者synchronized方法)。

nofityAll()方法能夠喚醒所有正在等待該物件的monitor的執行緒,這一點與notify()方法是不同的。

相關推薦

wait()notify()notifyAll()是 Object 方法

從這三個方法的文字描述可以知道以下幾點資訊: 1)wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。 2)呼叫某個物件的wait()方法能讓當前執行緒阻塞,並且當前執行緒必須擁有此物件的monitor(即鎖) 3)呼叫某個物件的notify()方

ObjectwaitnotifynotifyAll

Obect的wait、notify 和 notifyAll是Object提供的同步方法,也就是所有物件都生而帶來的方法,估計搞java的沒有不知道這幾個方法的。那麼他究竟是怎麼使用的呢?在此處記錄一下自己的理解。 先上一個最最最簡單的例子。 1 public class SynchronizedTest

【併發程式設計】ObjectwaitnotifynotifyAll方法

本部落格系列是學習併發程式設計過程中的記錄總結。由於文章比較多,寫的時間也比較散,所以我整理了個目錄貼(傳送門),方便查閱。 併發程式設計系列部落格傳送門 方法簡介 wait方法 wait方法是Object類中的一個方法。呼叫這個方法會讓呼叫執行緒進入waiting狀態,直到另一個執行緒呼叫了當前物件上的

wait()notify()notifyAll()sleep()Conditionawait()signal()

wait()、notify()和notifyAll()是 Object類 中的方法 從這三個方法的文字描述可以知道以下幾點資訊: 1) wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。 2)呼叫某個物

Java多執行緒同步同步程式碼塊waitnotifynotifyAll的真正含義與工作原理

今天在和導師討論Java多執行緒程式設計的同步問題時,發現自己對同步程式碼塊、wait()方法、notify()方法和notifyAll()方法的理解不太清晰,於是在網上查閱資料,可是結果眾說紛紜,又在

Java 執行緒的通訊 wait() 與 notify() notifyAll()的使用

@[toc](Java 執行緒的通訊 wait() 與 notify() 和 notifyAll()的使用) 1. 執行緒通訊 wait() 與 notify() 和 notifyAll() ① wait():令當前執行緒掛起並放棄CPU、同步資源,使別的執行緒可訪問並修

synchronized靜態程式碼塊,以及其中的waitnotifynotifyAll

接觸Java多執行緒這麼久了,synchronized靜態程式碼塊以及其中的wait和notify方法一直沒搞懂,網上關於此,不是旁敲側擊,就是晦澀難懂(我理解能力有限),實在無語了。今天把Java的原始碼匯入到了eclipse,從原始碼中看到了我想要的答案

【Java面試題】之Object方法詳解

之前看到有人分享的面經,面試官先問Object中有什麼方法,然後再要求解釋每一次方法的作用。 先看看Object中有什麼方法 Object類是Java中所有類的基類。位於java.lang包中,一共有13個方法 方法一 Object() 即Object的構造方法 大

Java執行緒sleep()wait()notify()notifyAll()yield()join()等方法的用法區別

Java執行緒中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和區別從作業系統的角度講,os會維護一個ready queue(就緒的執行緒佇列)。並且在某一

wait(),notify(),notifyAll()用來操作執行緒為什麼定義在Objectwait(),sleep()區別?

wait(),notify(),notifyAll()用來操作執行緒為什麼定義在Object類中? 這些方法存在於同步中; 使用這些方法必須標識同步所屬的鎖; 鎖可以是任意物件,所以任意物件呼叫方法一定定義在Object類中。 wait(),sleep(

轉載 wait(),notify(),notifyAll()用來操作線程為什麽定義在Object

not 調用 存在 await on() 比較 保護 接口 sign 這些方法存在於同步中; 使用這些方法必須標識同步所屬的鎖; 鎖可以是任意對象,所以任意對象調用方法一定定義在Object類中。 Condition是在java 1.5中才出現的,它用來替

Java並發之線程間協作Objectwait()notify()notifyAll()

它的 ring sleep方法 子類 string exce 程序退出 data- 差異 wait()、notify()和notifyAll()是Object類中的方法: 1)wait()、notify()和notifyAll()方法是本地方法,而且為fina

Java並發編程:線程間協作的兩種方式:waitnotifynotifyAllCondition

消費者 CI 能夠 .com stat consumer 使用 producer imp 原文鏈接 Java並發編程:線程間協作的兩種方式:wait、notify、notifyAll和Condition 在前面我們將了很多關於同步的問題,然而在現實中,需要線程之間的協作。比

waitnotifynotifyAllCondition

轉自  http://www.cnblogs.com/dolphin0520/p/3920385.html 用來學習記錄              可以用最經典的生產者-消費者模型:當佇列滿時,生產者需要等

Java序列化的方式object方法介面抽象的區別ArrayList在迴圈過程刪除

Java序列化的方式 a.是相應的物件實現了序列化介面Serializable,這個使用的比較多,對於序列化介面Serializable介面是一個空的介面,它的主要作用就是標識這個物件時可序列化的,jre物件在傳輸物件的時候會進行相關的封裝。 b.Externlizab

17-Java併發程式設計:執行緒間協作的兩種方式:waitnotifynotifyAllCondition

Java併發程式設計:執行緒間協作的兩種方式:wait、notify、notifyAll和Condition   在前面我們將了很多關於同步的問題,然而在現實中,需要執行緒之間的協作。比如說最經典的生產者-消費者模型:當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放

Java併發程式設計:執行緒間協作的兩種方式:waitnotifynotifyAllCondition

在前面我們將了很多關於同步的問題,然而在現實中,需要執行緒之間的協作。比如說最經典的生產者-消費者模型:當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源(即佇列)的佔用權。因為生產者如果不釋放對臨界資源的佔用權,那麼消費者

Thread之七:Object裡的waitnotifynotifyAll的使用方法

wait()、notify()、notifyAll()是三個定義在Object類裡的方法,可以用來控制執行緒的狀態 public final native void notify(); public final native void notifyAll(); public final na

執行緒的一些常用方法的用法 join()yield()sleep()wait()notify()notifyAll()

1.執行緒休眠sleep();:執行緒有優先順序,但是我們可以用此方法人為的改變它們的優先順序,讓執行緒暫停,它其他執行緒獲得分配空間。 用法:Thread.sleep(2000);//休眠兩秒 2.執行緒讓步yield();就是讓出自己的分配空間給其他執行

執行緒sleep()方法Objectwait()方法的區別

這兩者的施加者是有本質區別的. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我