中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java monitor機制使用方法解析

發布時間:2020-08-22 03:17:05 來源:腳本之家 閱讀:322 作者:shemlothae 欄目:編程語言

monitor概念

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

一個重要特點是,在同一時間,只有一個線程/進程能進入monitor所定義的臨界區,這使得monitor能夠實現互斥的效果。無法進入monitor的臨界區的進程/線程,應該被阻塞,并且在適當的時候被喚醒。顯然,monitor作為一個同步工具,也應該提供這樣管理線程/進程的機制。

monitor這個機制之所以被稱為:更高級的原語,它不可避免的需要對外屏蔽這些機制,并且在內部實現這些機制,使得monitor成為一個簡潔易用的借口。

monitor基本元素

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

使用monitor主要是為了互斥進入臨界區,為了能夠阻塞無法進入臨界區的進程,線程,需要一個monitor object來協助,這個object內部會有相應的數據結構,例如列表,用來保存被阻塞的線程;同時由于monitor機制本質是基于mutex原語的,所以object必須維護一個基于mutex的鎖。

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

monitor在java中的實現

臨界區的圈定

被synchronized關鍵字修飾的方法,代碼塊,就是monitor機制的臨界區

monitor object

在上述synchronized關鍵字被使用時,往往需要指定一個對象與之關聯,例如synchronized(this),總之,synchronized需要管理一個對象,這個對象就是monitor object。

monitor機制中,monitor 我不檢測題充當著維護mutex和wait, signalAPI來管理線程的阻塞和喚醒。

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

Java monitor機制使用方法解析

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林西县| 辉县市| 中西区| 江永县| 东源县| 栾川县| 瓦房店市| 新宾| 上饶市| 车险| 合山市| 长治市| 遂宁市| 阳高县| 汝城县| 澜沧| 丹东市| 平顺县| 文成县| 正安县| 冕宁县| 北海市| 甘肃省| 阿拉善盟| 罗源县| 肇源县| 新河县| 轮台县| 达日县| 苍梧县| 桐乡市| 台中县| 吉木乃县| 陆丰市| 克什克腾旗| 文安县| 兴海县| 临江市| 东方市| SHOW| 崇义县|