監視器:Java同步的基本思想

2021-01-07 Java從零開始

如果您上過大學的作業系統課程,您可能還記得監視器是作業系統中同步的重要概念。它也用於Java同步。這篇文章使用類比來解釋「監視器」的基本概念。

1.什麼是監視器?

監視器可以視為包含特殊房間的建築物。特殊房間一次只能容納一個客戶(線程)。房間通常包含一些數據和代碼。

如果客戶要佔用特殊房間,則必須先進入走廊(進入套裝)以等待。調度程序將根據某些條件(例如FIFO)選擇一個。如果由於某種原因他被停職,他將被送往候診室,並安排以後再進入特別室。如上圖所示,該建築物中有3個房間。

簡而言之,監視器是監視線程對特殊房間的訪問的設備。它確保只有一個線程可以訪問受保護的數據或代碼。

2.如何用Java實現?

在Java虛擬機中,每個對象和類在邏輯上都與監視器關聯。為了實現監視器的互斥功能,將一個鎖(有時稱為互斥鎖)與每個對象和類關聯。這在作業系統書籍中稱為信號量,互斥體是二進位信號量。

如果一個線程對某些數據擁有鎖,那麼只有擁有該線程的線程釋放該鎖,其他線程才能獲得該鎖。如果在進行多線程編程時始終需要編寫信號量,那將不方便。幸運的是,由於JVM自動為我們執行了此操作,因此我們不需要這樣做。

為了聲明一個監視區域,這意味著數據不能被多個線程訪問,Java提供了同步語句和同步方法。一旦代碼中嵌入了synced關鍵字,它就是一個監視區域。JVM自動在後臺實現鎖。

3.在Java同步代碼中,監視器是哪一部分?

我們知道每個對象/類都與一個Monitor關聯。我認為可以說每個對象都有一個監視器,因為每個對象可以有自己的關鍵部分,並且能夠監視線程序列。

為了啟用不同線程的協作,Java提供了wait()和notify()來掛起一個線程並喚醒另一個正在對象上等待的線程。此外,還有其他3個版本:

wait(longtimeout, int nanos)

wait(longtimeout) notified by other threads or notified by timeout. notify(all)

這些方法只能在同步語句或同步方法中調用。原因是,如果一個方法不需要相互排斥,則不需要監視線程之間或進行協作,則每個線程都可以自由訪問該方法。

最後,開發這麼多年我也總結了一套學習Java的資料與面試題,如果你在技術上面想提升自己的話,可以關注我,私信發送領取資料或者在評論區留下自己的聯繫方式,有時間記得幫我點下轉發讓跟多的人看到哦。

相關焦點

  • Java基礎學習:java中的基本數據類型
    一、基本類型 1、基本類型 不使用New創建,聲明一個非引用傳遞的變量,且變量的值直接置於堆棧中,大小不隨運行環境變化,效率更高。使用new創建的引用對象存儲在堆中。
  • 面試頻率最高的簡單問題——Java類的三大基本特徵
    學習過Java的程式設計師都知道,java類有三大特徵——封裝、繼承和多態。下面的文章給大家詳細的介紹一下java的這三大特性。封裝封裝是將描述某類事物的數據與處理這些數據的函數封裝在一起,形成一個有機整體,稱為類。類所具有的的封裝性可使程序模塊具有良好的獨立性與可維護性。
  • 提升java編程性能優化知識 程式設計師必看這幾點
    提升java編程性能優化知識 程式設計師必看這幾點  控制資源的使用,通過線程同步來控制資源的並發訪問;  控制實例的產生,以達到節約資源的目的;  控制數據共享,在不建立直接關聯的條件下所以synchronize的方法儘量小,並且應儘量使用方法同步代替代碼塊同步。
  • JAVA校招題基礎知識點複習第六天(一張圖搞懂所有集合特點)
    集合其實和數組一樣都是java中提供的一種容器,可以用來存儲多個數據。既然集合和數組都容器,那麼他們有什麼區別呢?1、數組的長度是固定的,集合的長度是可變的。2、數組中存儲的是同一類型的元素,可以存儲基本數據類型值。3、集合存儲的都是對象。而且對象的類型可以不一致。在開發中一般當對象多的時候,使用集合進行存儲。了解完集合與數組的區別,讓我們來看看在JAVA中都為我們提供了哪些集合?
  • 慧眼識真器:液晶監視器性能關注與選購
    1液晶監視器性能關注  隨著用戶需求的逐步增加,液晶監視器市場進入了發展的快車道,但眾所周知,如今市場上液晶監視器品牌層出不窮,那麼如何才能在眾多形形色色的產品或者品牌中選購到適合自己需要的液晶監視器,對於客戶來說就尤其重要了。
  • Java反射機制深入詳解
    基本的 Java類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。
  • JAVA專業術語面試100問
    4、java有哪些基本數據類型?5、數組有沒有length()方法?String有沒有length()方法?數組沒有length()方法,它有length屬性。String有length()方法。17、java中的throw 和 throws關鍵字有什麼區別?18、列舉幾個你了解的幾個常見的運行時異常?19、final, finally, finalize有什麼區別?20、描述Java內存模型?
  • 性能監視器(PerfMon)
    性能監視器(PerfMon) 系統安全 大小: 0.11M 版本: 1.21
  • AQS設計思想與重要欄位詳解
    本文基於JDK1.8本篇學習目標了解AQS的設計思想以及重要欄位含義,如通過state欄位表示同步狀態等。了解AQS內部維護鏈式雙向同步隊列的結構以及幾個重要指針。了解五種重要的同步狀態。明確兩種模式:共享模式和獨佔模式。學習兩種模式下AQS提供的模板方法:獲取與釋放同步狀態相關方法。
  • Java基礎教程:java反射機制教程
    這時候java語言在設計的時候為我們提供了一個機制,就是反射機制,他能夠很方便的去解決我們的問題。 二、深入分析java反射機制 1、獲取Class類 在java中萬事萬物皆對象,Useruser=newUser()一行代碼我們知道了user是User類的實例對象,通過Studentstu=newStudent()我們知道了
  • 跟我學java編程—認識java的整數類型
    Java語言中,基本的整型數據類型有byte、short、int、long四種類型,用於需要不同存儲空間的數據使用。整型有正整數和負整數之分,在Java語言中,規定整型的最高位為符號位,最高位為「0」表示正數,最高位為「1」表示負數,其它位表示數值。因此整型類型的數據能夠表示的最小值為:-2n-1 —2n-1-1(n為該類型所佔存儲空間的二進位位數)。
  • 上半年監視器廠商遭遇不完美風暴
    媒體平板銷量快速增長,而經濟成長速度放慢,導致2011年整體監視器市場增長緩慢。因此,IHS公司把2011年全年監視器出貨量增長率預估從2.5%降到了1.5%。本文引用地址:http://www.eepw.com.cn/article/123354.htm  目前預計2011年全球監視器銷量為1.732億臺,而2010年是1.707億臺。
  • 深入分析java中的多態(從jvm角度分析)
    到了這基本上就對多態形式的代碼實現進行了演示,案例也比較簡單,但是這對我們理解多態的思想還不夠,我們最主要的還是從虛擬機的角度來分析一下。三、分析多態想要深入分析多態,我們需要弄清楚幾個問題。其實java虛擬機在執行java程序的時候,並不是直接運行的,他需要一個過程,我們使用一張圖來看下:上面這張圖已經很清晰,也就是說,我們的java文件要想運行,需要通過java編譯器編譯成.class文件,然後通過類裝載器講.class文件裝載到JVM中,最後才是執行。
  • 程式設計師:java單例模式,為什麼要加雙重鎖?為什麼要加volatile?
    如果說我們沒有第一次驗校,每一個線程都要走synchronized 中的代碼,而每一次線程都要去拿到同步鎖才能執行。在多線程的情況下每一個線程要拿到single 對象都要排隊等待同步鎖釋放。因此第一次驗校作用就是為了提高程序的效率。2.為什麼要進行第二次判空舉個例子:假如現在沒有第二次驗校,線程A執行到第一次驗校那裡,它判斷到single ==null。
  • 做java的你,這些英文單詞都掌握了嗎?
    9、Casting 類型轉換 :即一個類型到另一個類型的轉換,可以是基本數據類型的轉換,也可以是對象類型的轉換10、Char 字符:容納單字符的一種基本數據類型。11、Child class 子類:見繼承類Derived class12、Class 類:面向對象中的最基本、最重要的定義類型。
  • 如何才能更好的保護好22寸液晶監視器!
    因為在液晶屏幕的構造中,基本呈現一個夾芯的狀況,即兩塊玻璃基本中間充滿著運動的液晶分子。而信號電壓則直接控制晶體的開關狀態。並利用電晶體控制液晶分子但對於液晶分子來說,其本身也有著明顯的光學各向異性。以調節燈光發射管的光線,從而實現圖像的高清顯示。 液晶監視器
  • JAVA編程——二分法查找
    一、二分法檢索過程二分法檢索(binary search)又稱折半檢索,二分法檢索的基本思想是設數組中的元素從小到大有序地存放在數組(array)中(註:二分法查找的關鍵,首先數組元素必須從小到大有序排列),(1)首先將給定值 key 與數組中間位置上元素的關鍵碼(key)比較,如果相等,則檢索成功
  • Win7的隱藏管家:性能監視器
    可以使用Windows性能監視器實時檢查運行程序影響計算機性能的方式並通過收集日誌數據供以後分析使用。對於平時在測試過程中,經常需要查看「性能監視器」中的數據,現在教大家開啟「性能監視器」的方法:1、開始-運行(或者按Win+R鍵打開運行對話框)2、輸入「perfmon」, 然後回車
  • getty 發布,一個完全基於 java 實現的 aio 框架
    3、本人對netty比較喜歡,無論是其性能還是編程思想(JBOSS提供的一個java開源網絡框架,可以說是java網絡通訊裡的一哥,極其穩定和強大的性能使得被廣泛使用)4、有了netty為何還要自己造輪子?這裡有兩個原因,其一是本人就喜歡造輪子,這是病,改不了。
  • 我的世界:java版與基巖版,相差兩歲的哥弟倆,有多少不同特性?
    2009年,notch著手開發Minecraft的java版本。2011年,mojang工作室開發了Minecraft移動版,又稱攜帶版,最後被統稱為基巖版。從開發時間來講,java版與基巖版算是一對相差2歲的兄弟倆。由於版本不同,帶來了很多遊戲特性的差異。