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

Java monitor機(jī)制使用方法解析

 更新時(shí)間:2019年09月29日 14:26:04   作者:shemlothae  
這篇文章主要介紹了Java monitor機(jī)制使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

monitor概念

管程,監(jiān)視器。在操作系統(tǒng)中,存在著semaphore和mutex,即信號(hào)量和互斥量,使用基本的mutex進(jìn)行開發(fā)時(shí),需要小心的使用mutex的down和up操作,否則容易引發(fā)死鎖問題。為了更好的編寫并發(fā)程序,在mutex和semaphore基礎(chǔ)上,提出了更高層次的同步原語,實(shí)際上,monitor屬于編程語言的范疇,C語言不支持monitor,而java支持monitor機(jī)制。

一個(gè)重要特點(diǎn)是,在同一時(shí)間,只有一個(gè)線程/進(jìn)程能進(jìn)入monitor所定義的臨界區(qū),這使得monitor能夠?qū)崿F(xiàn)互斥的效果。無法進(jìn)入monitor的臨界區(qū)的進(jìn)程/線程,應(yīng)該被阻塞,并且在適當(dāng)?shù)臅r(shí)候被喚醒。顯然,monitor作為一個(gè)同步工具,也應(yīng)該提供這樣管理線程/進(jìn)程的機(jī)制。

monitor這個(gè)機(jī)制之所以被稱為:更高級(jí)的原語,它不可避免的需要對(duì)外屏蔽這些機(jī)制,并且在內(nèi)部實(shí)現(xiàn)這些機(jī)制,使得monitor成為一個(gè)簡潔易用的借口。

monitor基本元素

  • 臨界區(qū)
  • monitor對(duì)象和鎖
  • 條件變量以及定義在monitor對(duì)象上的wait,signal操作

使用monitor主要是為了互斥進(jìn)入臨界區(qū),為了能夠阻塞無法進(jìn)入臨界區(qū)的進(jìn)程,線程,需要一個(gè)monitor object來協(xié)助,這個(gè)object內(nèi)部會(huì)有相應(yīng)的數(shù)據(jù)結(jié)構(gòu),例如列表,用來保存被阻塞的線程;同時(shí)由于monitor機(jī)制本質(zhì)是基于mutex原語的,所以object必須維護(hù)一個(gè)基于mutex的鎖。

此外,為了在適當(dāng)?shù)臅r(shí)候能夠阻塞和喚醒 進(jìn)程/線程,還需要引入一個(gè)條件變量,這個(gè)條件變量用來決定什么時(shí)候是“適當(dāng)?shù)臅r(shí)候”,這個(gè)條件可以來自程序代碼的邏輯,也可以是在 monitor object 的內(nèi)部,總而言之,程序員對(duì)條件變量的定義有很大的自主性。不過,由于 monitor object 內(nèi)部采用了數(shù)據(jù)結(jié)構(gòu)來保存被阻塞的隊(duì)列,因此它也必須對(duì)外提供兩個(gè) API 來讓線程進(jìn)入阻塞狀態(tài)以及之后被喚醒,分別是 wait 和 notify。

monitor在java中的實(shí)現(xiàn)

臨界區(qū)的圈定

被synchronized關(guān)鍵字修飾的方法,代碼塊,就是monitor機(jī)制的臨界區(qū)

monitor object

在上述synchronized關(guān)鍵字被使用時(shí),往往需要指定一個(gè)對(duì)象與之關(guān)聯(lián),例如synchronized(this),總之,synchronized需要管理一個(gè)對(duì)象,這個(gè)對(duì)象就是monitor object。

monitor機(jī)制中,monitor 我不檢測(cè)題充當(dāng)著維護(hù)mutex和wait, signalAPI來管理線程的阻塞和喚醒。

Java 對(duì)象存儲(chǔ)在內(nèi)存中,分別分為三個(gè)部分,即對(duì)象頭、實(shí)例數(shù)據(jù)和對(duì)齊填充,而在其對(duì)象頭中,保存了鎖標(biāo)識(shí);同時(shí),java.lang.Object 類定義了 wait(),notify(),notifyAll() 方法,這些方法的具體實(shí)現(xiàn),依賴于一個(gè)叫 ObjectMonitor 模式的實(shí)現(xiàn),這是 JVM 內(nèi)部基于 C++ 實(shí)現(xiàn)的一套機(jī)制,基本原理如下所示:

當(dāng)一個(gè)線程需要獲取 Object 的鎖時(shí),會(huì)被放入 EntrySet 中進(jìn)行等待,如果該線程獲取到了鎖,成為當(dāng)前鎖的 owner。如果根據(jù)程序邏輯,一個(gè)已經(jīng)獲得了鎖的線程缺少某些外部條件,而無法繼續(xù)進(jìn)行下去(例如生產(chǎn)者發(fā)現(xiàn)隊(duì)列已滿或者消費(fèi)者發(fā)現(xiàn)隊(duì)列為空),那么該線程可以通過調(diào)用 wait 方法將鎖釋放,進(jìn)入 wait set 中阻塞進(jìn)行等待,其它線程在這個(gè)時(shí)候有機(jī)會(huì)獲得鎖,去干其它的事情,從而使得之前不成立的外部條件成立,這樣先前被阻塞的線程就可以重新進(jìn)入 EntrySet 去競爭鎖。這個(gè)外部條件在 monitor 機(jī)制中稱為條件變量。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java使用Gateway自定義負(fù)載均衡過濾器

    Java使用Gateway自定義負(fù)載均衡過濾器

    這篇文章主要介紹了Java使用Gateway自定義負(fù)載均衡過濾器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • RestTemplat中關(guān)于getForobject方法的使用

    RestTemplat中關(guān)于getForobject方法的使用

    這篇文章主要介紹了RestTemplat中關(guān)于getForobject方法的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java 中解決Unsupported major.minor version 51.0的問題

    Java 中解決Unsupported major.minor version 51.0的問題

    本文主要介紹解決Unsupported major.minor version 51.0的問題, 這里給大家整理了詳細(xì)資料,有需要的小伙伴可以參考下
    2016-08-08
  • Nett分布式分隔符解碼器邏輯源碼剖析

    Nett分布式分隔符解碼器邏輯源碼剖析

    這篇文章主要為大家介紹了Nett分布式分隔符解碼器邏輯源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java面試為何阿里強(qiáng)制要求不在foreach里執(zhí)行刪除操作

    Java面試為何阿里強(qiáng)制要求不在foreach里執(zhí)行刪除操作

    那天,小二去阿里面試,面試官老王一上來就甩給了他一道面試題:為什么阿里的 Java 開發(fā)手冊(cè)里會(huì)強(qiáng)制不要在 foreach 里進(jìn)行元素的刪除操作
    2021-11-11
  • SpringBoot中的事務(wù)回滾規(guī)則詳解

    SpringBoot中的事務(wù)回滾規(guī)則詳解

    這篇文章主要介紹了SpringBoot中的事務(wù)回滾規(guī)則詳解,事務(wù)是指一系列的操作,這些操作要么全部成功,要么全部失敗。在Spring Boot中,我們可以使用事務(wù)管理器來管理事務(wù),在使用事務(wù)管理器的時(shí)候,一個(gè)非常重要的概念就是事務(wù)回滾,需要的朋友可以參考下
    2023-07-07
  • Java 中FastJson的基本使用

    Java 中FastJson的基本使用

    fastjson 是一個(gè)性能很好的 Java 語言實(shí)現(xiàn)的 JSON 解析器和生成器,來自阿里巴巴的工程師開發(fā)。下面通過本文給大家介紹Java 中FastJson的基本使用,需要的朋友參考下吧
    2017-11-11
  • 解決springboot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Error creating bean with name dataSourceScriptDatabaseInitializer問題

    解決springboot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Error creating bean with&nb

    這篇文章主要介紹了解決springboot項(xiàng)目啟動(dòng)報(bào)錯(cuò)Error creating bean with name dataSourceScriptDatabaseInitializer問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2024-03-03
  • 使用spring-cache一行代碼解決緩存擊穿問題

    使用spring-cache一行代碼解決緩存擊穿問題

    本文主要介紹了使用spring-cache一行代碼解決緩存擊穿問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中自定義異常詳解及實(shí)例代碼

    Java中自定義異常詳解及實(shí)例代碼

    這篇文章主要介紹了Java中自定義異常詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

凤凰县| 东山县| 揭阳市| 元谋县| 农安县| 额济纳旗| 铜陵市| 揭西县| 盈江县| 共和县| 张家口市| 隆回县| 荔波县| 凯里市| 兖州市| 平远县| 亳州市| 甘肃省| 夹江县| 襄城县| 巫山县| 扬中市| 宣武区| 双流县| 壶关县| 谷城县| 宁波市| 郸城县| 嘉禾县| 元朗区| 昌都县| 军事| 威远县| 洛南县| 高邑县| 南溪县| 南涧| 青海省| 沈阳市| 崇明县| 义乌市|