7.1監(jiān)視器-Java同步的基本思想

如果你在大學(xué)學(xué)習(xí)過操作系統(tǒng)這門課,監(jiān)視器是操作系統(tǒng)中做同步的重要概念(額孤钦,我真沒聽過,難道翻譯過來的不一樣)纯丸。它也用于Java同步偏形。這個(gè)帖子用類比來解釋“監(jiān)視”的基本思想。

1.什么是監(jiān)視器

監(jiān)視器可以看做包含特殊事物的房間觉鼻。這個(gè)特殊房間一次只能被一個(gè)消費(fèi)者(線程)暫用俊扭。這個(gè)房間通常包含一些數(shù)據(jù)和代碼。

監(jiān)視器房間

如果客戶想要占用這個(gè)特殊房間坠陈,他必須進(jìn)入走廊(hallWay)才能等到统扳。調(diào)度器會(huì)根據(jù)特定的算法(比如先進(jìn)先出)來選擇一個(gè)喘帚。如果它被某種原因掛起了,他將會(huì)被送到等候室咒钟,以后按照調(diào)度進(jìn)入這個(gè)特殊房間吹由。如上圖所示,這個(gè)建筑物有三個(gè)客房朱嘴。

訪問特殊代碼

簡(jiǎn)而言之倾鲫,監(jiān)視器是確保每次只有一個(gè)線程來訪問特定的代碼和數(shù)據(jù)的裝置。

2.它是怎么在Java中實(shí)現(xiàn)的萍嬉?

在Java虛擬機(jī)中乌昔,每個(gè)對(duì)象和類都與監(jiān)視器相關(guān)聯(lián)。為了實(shí)現(xiàn)監(jiān)視器的互斥能力壤追,鎖(有時(shí)稱為互斥)和每個(gè)對(duì)象和類相互關(guān)聯(lián)磕道。這在操作系統(tǒng)書中被稱為信號(hào)量,互斥是為二維信號(hào)量行冰。

如果一個(gè)線程擁有某些數(shù)據(jù)的鎖定溺蕉,那么其他線程將不能獲得鎖直到擁有該鎖的線程釋放它為止。如果我們?cè)诙嗑€程編程中一直操作一個(gè)信號(hào)量將不方便悼做。幸運(yùn)的Java虛擬機(jī)自動(dòng)為我們做了這些疯特。

要聲明一個(gè)監(jiān)視區(qū),意味著數(shù)據(jù)不能被多個(gè)線程訪問肛走,Java提供同步語句和同步方法漓雅。一旦代碼嵌入了synchronized關(guān)鍵字,它就是一個(gè)監(jiān)視器區(qū)域朽色。這些鎖由Java虛擬機(jī)自動(dòng)實(shí)現(xiàn)邻吞。

3.在Java的同步代碼中,哪部分是監(jiān)視器葫男?

我們知道任何一個(gè)類或?qū)ο蠖己捅O(jiān)視器綁定吃衅。我認(rèn)為每個(gè)對(duì)象都有個(gè)監(jiān)視器是很好的,因?yàn)槊總€(gè)對(duì)象可以有自己的關(guān)鍵部分(能夠見識(shí)線程序列)腾誉。

為了啟用不同的線程協(xié)作,Java提供wait()和notify()來掛起一個(gè)線程峻呕,并分別喚醒另一個(gè)在此對(duì)象等待的線程利职。另外還有三個(gè)其他版本:

wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout. 
notify(all)

這些方法只能在synchronized語句或synchronized方法中調(diào)用。原因瘦癌,如果一個(gè)方法不需要互斥猪贪,那么就不需要線程之間的監(jiān)視或協(xié)作,每個(gè)線程都可以自由地訪問他們讯私。
下面是同步代碼的示例:
Reference:1. Java Doc for Object

  1. Thread synchronization
  2. Locks and Synchronization
  3. notify() vs notifyAll()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末热押,一起剝皮案震驚了整個(gè)濱河市西傀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌桶癣,老刑警劉巖拥褂,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異牙寞,居然都是意外死亡饺鹃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門间雀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悔详,“玉大人,你說我怎么就攤上這事惹挟∏洋Γ” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵连锯,是天一觀的道長(zhǎng)归苍。 經(jīng)常有香客問我,道長(zhǎng)萎庭,這世上最難降的妖魔是什么霜医? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮驳规,結(jié)果婚禮上肴敛,老公的妹妹穿的比我還像新娘。我一直安慰自己吗购,他們只是感情好医男,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捻勉,像睡著了一般镀梭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上踱启,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天报账,我揣著相機(jī)與錄音,去河邊找鬼埠偿。 笑死透罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冠蒋。 我是一名探鬼主播羽圃,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抖剿!你這毒婦竟也來了朽寞?” 一聲冷哼從身側(cè)響起识窿,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脑融,沒想到半個(gè)月后喻频,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨掌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年半抱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膜宋。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窿侈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秋茫,到底是詐尸還是另有隱情史简,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布肛著,位于F島的核電站圆兵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏枢贿。R本人自食惡果不足惜殉农,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望局荚。 院中可真熱鬧超凳,春花似錦、人聲如沸耀态。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽首装。三九已至创夜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仙逻,已是汗流浹背驰吓。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留系奉,地道東北人檬贰。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喜最,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庄蹋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki 瞬内,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,120評(píng)論 0 14
  • 一迷雪、進(jìn)程和線程 進(jìn)程 進(jìn)程就是一個(gè)執(zhí)行中的程序?qū)嵗總€(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間虫蝶,一個(gè)進(jìn)程中可以有多個(gè)線程章咧。...
    阿敏其人閱讀 2,612評(píng)論 0 13
  • Java8張圖 11、字符串不變性 12能真、equals()方法赁严、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,704評(píng)論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法粉铐,類相關(guān)的語法疼约,內(nèi)部類的語法,繼承相關(guān)的語法蝙泼,異常的語法程剥,線程的語...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • 3月21日 星期二 晴天 今天下午第二節(jié)課,我們一年級(jí)舉行紙飛機(jī)比賽汤踏,每班派出十五名同學(xué)參加织鲸,我們班我...
    A葉瑞妹閱讀 379評(píng)論 2 4