最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談鎖和監(jiān)視器之間的區(qū)別_Java并發(fā)

 更新時(shí)間:2017年06月18日 10:07:38   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇詳談鎖和監(jiān)視器之間的區(qū)別_Java并發(fā)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧

在面試中你可能遇到過這樣的問題:鎖(lock)和監(jiān)視器(monitor)有什么區(qū)別?

嗯,要回答這個(gè)問題,你必須深入理解Java的多線程底層是如何工作的。

簡(jiǎn)短的答案是,鎖為實(shí)現(xiàn)監(jiān)視器提供必要的支持。詳細(xì)答案如下。

鎖(lock)

邏輯上鎖是對(duì)象內(nèi)存堆中頭部的一部分?jǐn)?shù)據(jù)。JVM中的每個(gè)對(duì)象都有一個(gè)鎖(或互斥鎖),任何程序都可以使用它來(lái)協(xié)調(diào)對(duì)對(duì)象的多線程訪問。如果任何線程想要訪問該對(duì)象的實(shí)例變量,那么線程必須擁有該對(duì)象的鎖(在鎖內(nèi)存區(qū)域設(shè)置一些標(biāo)志)。所有其他的線程試圖訪問該對(duì)象的變量必須等到擁有該對(duì)象的鎖有的線程釋放鎖(改變標(biāo)記)。

一旦線程擁有一個(gè)鎖,它可以多次請(qǐng)求相同的鎖,但是在其他線程能夠使用這個(gè)對(duì)象之前必須釋放相同數(shù)量的鎖。如果一個(gè)線程請(qǐng)求一個(gè)對(duì)象的鎖三次,如果別的線程想擁有該對(duì)象的鎖,那么之前線程需要 “釋放”三次鎖。

Java中顯示鎖的使用語(yǔ)法如下:

…
private Lock bankLock = new ReentrantLock();
…
 public double getTotalBalance()
  {
   bankLock.lock();
   try
   {
     double sum = 0;

     for (double a : accounts)
      sum += a;

     return sum;
   }
   finally
   {
     bankLock.unlock();
   }
  }

1) 鎖用來(lái)保護(hù)代碼片段,任何時(shí)刻只能有一個(gè)線程執(zhí)行被保護(hù)的代碼。

2) 鎖可以管理試圖進(jìn)入被保護(hù)代碼的線程

3) 鎖可以擁有一個(gè)或者多個(gè)相關(guān)的條件對(duì)象

4) 每個(gè)條件對(duì)象管理那些已經(jīng)進(jìn)入被保護(hù)的代碼段,但還不能運(yùn)行的線程

Lock和Condition接口為程序設(shè)計(jì)人員提供了高度的鎖定控制。然后大多數(shù)情況下,并不需要這樣的控制,并且可以使用一種嵌入Java語(yǔ)言的內(nèi)部機(jī)制。從1.0版本開始,Java中的每一個(gè)對(duì)象都有一個(gè)內(nèi)部鎖。如果一個(gè)方法用synchronized關(guān)鍵字聲明,那么對(duì)象的鎖將保護(hù)整個(gè)方法。也就說(shuō),要調(diào)用該方法,線程必須獲得內(nèi)部的對(duì)象鎖。

內(nèi)部鎖的一般用法如下:

public synchronized void transfer(int from, int to, double amount) throws InterruptedException
  {
   while (accounts[from] < amount)
     wait();
   System.out.print(Thread.currentThread());
   accounts[from] -= amount;
   System.out.printf(" %10.2f from %d to %d", amount, from, to);
   accounts[to] += amount;
   System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
   notifyAll();
  }

可以看到,用synchronized關(guān)鍵字來(lái)編寫代碼簡(jiǎn)潔得多。當(dāng)然要理解這一代碼,你必須了解每一個(gè)對(duì)象有一個(gè)內(nèi)部鎖,并且該鎖有一個(gè)內(nèi)部條件。由鎖來(lái)管理那些試圖進(jìn)入synchronized方法的線程,由條件來(lái)管理那些調(diào)用wait的線程

然而,講了這么多,實(shí)際上推薦最好優(yōu)先使用BlockQueue,Excutor,同步集合等,然后再是synchronized關(guān)鍵字,最才是Lock/Condition

監(jiān)視器(Monitor)

監(jiān)視器是一中同步結(jié)構(gòu),它允許線程同時(shí)互斥(使用鎖)和協(xié)作,即使用等待集(wait-set)使線程等待某些條件為真的能力。

互斥

使用比較形象的說(shuō)明,監(jiān)視器就像一個(gè)包含一個(gè)特殊房間(對(duì)象實(shí)例)的建筑物,每次只能占用一個(gè)線程。這個(gè)房間通常包含一些需要防止并發(fā)訪問的數(shù)據(jù)。從一個(gè)線程進(jìn)入這個(gè)房間到它離開的時(shí)間,它可以獨(dú)占訪問房間中的任何數(shù)據(jù)。進(jìn)入監(jiān)控的建筑被稱為“進(jìn)入監(jiān)控監(jiān)視器。”進(jìn)入建筑內(nèi)部特殊的房間叫做“獲取監(jiān)視器”。房間占領(lǐng)被稱為“擁有監(jiān)視器”,離開被稱為“釋放監(jiān)視器。”讓整個(gè)建筑被稱為“退出監(jiān)視器。”

當(dāng)一個(gè)線程訪問受保護(hù)的數(shù)據(jù)(進(jìn)入特殊的房間)時(shí),它首先在建筑物接收(entry-set)中排隊(duì)。如果沒有其他線程在等待(擁有監(jiān)視器),線程獲取鎖并繼續(xù)執(zhí)行受保護(hù)的代碼。當(dāng)線程完成執(zhí)行時(shí),它釋放鎖并退出大樓(退出監(jiān)視器)。

如果當(dāng)一個(gè)線程到達(dá)并且另一個(gè)線程已經(jīng)擁有監(jiān)視器時(shí),它必須在接收隊(duì)列中等待(entry-set)。當(dāng)當(dāng)前所有者退出監(jiān)視器時(shí),新到達(dá)的線程必須與在入口集中等待的其他線程競(jìng)爭(zhēng)。只有一個(gè)線程能贏得競(jìng)爭(zhēng)并擁有鎖。

這里沒有wait-set的事。

合作

一般來(lái)說(shuō),只有當(dāng)多個(gè)線程共享數(shù)據(jù)或其他資源時(shí),互斥才是重要的。如果兩個(gè)線程不處理任何公共數(shù)據(jù)或資源,它們通常不能互相干擾,也不需要以互斥的方式執(zhí)行。盡管互斥有助于防止線程在共享數(shù)據(jù)時(shí)互相干擾,但合作有助于線程共同努力實(shí)現(xiàn)一些共同目標(biāo)。

合作在當(dāng)一個(gè)線程需要的數(shù)據(jù)改變?yōu)樵谝粋€(gè)特定的狀態(tài)時(shí)很重要,另一個(gè)線程負(fù)責(zé)將數(shù)據(jù)該入狀態(tài),如生產(chǎn)者/消費(fèi)者的問題,讀線程需要緩沖去在一個(gè)“不空”的狀態(tài)才可以從緩沖區(qū)中讀取任何數(shù)據(jù)。如果讀線程發(fā)現(xiàn)緩沖區(qū)為空,則必須等待。寫線程負(fù)責(zé)用數(shù)據(jù)填充緩沖區(qū)。一旦寫入線程完成了更多的寫入操作,讀線程可以進(jìn)行更多的讀取。它有時(shí)也稱為“Wait and Notify”或“Signal and Continue”監(jiān)視器,因?yàn)樗A魧?duì)監(jiān)視器的所有權(quán),并繼續(xù)執(zhí)行監(jiān)視區(qū)域(如果需要的話繼續(xù))。在稍后的時(shí)間內(nèi),通知線程釋放監(jiān)視器,等待線程重新恢復(fù)擁有鎖。

這種合作需要entry-setwait-set.。下面的圖表將有助于您理解這種合作。

上圖顯示監(jiān)視器為三個(gè)矩形。在該中心,一個(gè)大矩形包含一個(gè)線程,即監(jiān)視器的所有者。在左邊,一個(gè)小矩形包含entry set。在右邊,另一個(gè)小矩形包含wait set。

監(jiān)視器是由Per Brich Hansen和Tony Hoare提出的概念,Java以不精確的方式采用了它,也就是Java中的每個(gè)對(duì)象有一個(gè)內(nèi)部的鎖和內(nèi)部條件。如果一個(gè)方法用synchronized關(guān)鍵字聲明,那么,它表現(xiàn)的就像一個(gè)監(jiān)視器方法。通過wait/notifyAll/nofify來(lái)訪問條件變量

我希望上面內(nèi)容將有助于你更深入地了解Java多線程,歡迎提出任何問題。

以上這篇詳談鎖和監(jiān)視器之間的區(qū)別_Java并發(fā)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java把list分成多個(gè)list的方法示例

    Java把list分成多個(gè)list的方法示例

    在編程中將大的list集合拆分為多個(gè)小集合可以提高處理效率,主要拆分方法包括等量拆分適用于均勻處理數(shù)據(jù)、?指定數(shù)量拆分按固定子集大小劃分、根據(jù)條件拆分按特定規(guī)則進(jìn)行,這些方法有助于多線程異步處理,需要的朋友可以參考下
    2024-11-11
  • 實(shí)例分析java中重載與重寫的區(qū)別

    實(shí)例分析java中重載與重寫的區(qū)別

    這篇文章主要介紹了實(shí)例分析java中重載與重寫的區(qū)別,需要的朋友可以參考下
    2014-07-07
  • springBoot加入thymeleaf模板的方式

    springBoot加入thymeleaf模板的方式

    這篇文章主要介紹了springBoot加入thymeleaf模板的方式,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 一文掌握MyBatis?Plus的條件構(gòu)造器方法

    一文掌握MyBatis?Plus的條件構(gòu)造器方法

    這篇文章主要介紹了MyBatis?Plus的條件構(gòu)造器,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記

    Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記

    對(duì)于正則這個(gè)東西,對(duì)我來(lái)說(shuō)一直是很懵逼的,每次用每次查,然后還是記不住,下面這篇文章主要給大家介紹了關(guān)于Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 編輯器Ueditor和SpringBoot 的整合方法

    編輯器Ueditor和SpringBoot 的整合方法

    本文通過實(shí)例代碼給大家介紹了編輯器Ueditor和SpringBoot 的整合方法,需要的朋友參考下吧
    2017-08-08
  • logback使用MDCFilter日志過濾源碼解讀

    logback使用MDCFilter日志過濾源碼解讀

    這篇文章主要介紹了logback使用MDCFilter日志過濾源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java實(shí)現(xiàn)md5加密示例

    java實(shí)現(xiàn)md5加密示例

    這篇文章主要介紹了java實(shí)現(xiàn)md5加密示例,需要的朋友可以參考下
    2014-05-05
  • 詳解Java線程中斷知識(shí)點(diǎn)

    詳解Java線程中斷知識(shí)點(diǎn)

    在本篇文章中我們給大家分享了關(guān)于Java線程中斷的相關(guān)知識(shí)點(diǎn)內(nèi)容以及相關(guān)代碼實(shí)例,有興趣的朋友們可以學(xué)習(xí)下。
    2018-09-09
  • Java訪問修飾符public、private、protected及默認(rèn)訪問權(quán)限詳解

    Java訪問修飾符public、private、protected及默認(rèn)訪問權(quán)限詳解

    這篇文章主要介紹了Java訪問修飾符public、private、protected及默認(rèn)訪問權(quán)限的相關(guān)資料,每種修飾符都有其特定的使用場(chǎng)景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01

最新評(píng)論

怀宁县| 伊通| 长葛市| 福海县| 湖南省| 开江县| 山阴县| 诸城市| 珠海市| 徐闻县| 富顺县| 西和县| 桃园县| 托克逊县| 香港 | 图木舒克市| 兴宁市| 抚远县| 建湖县| 漳平市| 正镶白旗| 临泉县| 洪洞县| 长阳| 天台县| 西安市| 惠东县| 台北县| 濉溪县| 富蕴县| 和林格尔县| 毕节市| 德安县| 通渭县| 甘孜| 临桂县| 伽师县| 永新县| 惠来县| 册亨县| 府谷县|