2010-07-29 69 views
80

在Java中的併發編程中提到的監視器是什麼?什麼是Java中的顯示器?

當我讀到「每個對象都有關聯的顯示器」時,這意味着什麼?

它是一個特殊的對象嗎?

+7

+1這讓我讀了如何在JVM級別實現監視器。學到了新的東西 – naikus 2010-07-29 12:24:45

+0

@naikus我期待分享的細節:) – roottraveller 2016-10-16 11:58:54

回答

50

監視器是控制併發訪問對象的機制。

這允許你做:

線程1:

public void a() 
{ 
    synchronized(someObject) { 
     // do something (1) 
    } 
} 

線程2:

public void b() 
{ 
    synchronized(someObject) { 
     // do something else (2) 
    } 
} 

這防止線程1和2在相同的訪問被監視(同步)部時間。一個會開始,監視器會阻止另一個在第一個完成之前訪問該區域。

這不是一個特殊的對象。它是放置在類層次根目錄下的同步機制:java.lang.Object

也有waitnotify方法,它們也會使用對象的監視器來進行不同線程之間的通信。

+1

所以我們可以說,當我們創建一個同步方法時,我們正在定義一個對象方法的鎖(監視器)?確切地說, – xdevel2000 2010-07-29 12:29:14

+0

。當你需要一個同步的方法時(我沒有把它放在我的答案中),你正在爲這個方法創建一個監視器。 – 2010-07-29 12:34:11

+19

呃,不完全。無論其他事情如何,每個對象都會自動擁有一個與之關聯的監視器(互斥鎖)。當你聲明一個同步的方法時,你聲明運行時必須在該方法開始執行之前獲得對象監視器上的鎖(並且在控制返回到調用代碼之前必須釋放鎖)。 – 2010-07-29 12:34:16

14

監視器控制訪問對象的一個​​是具有一個既鎖一個實體和等候集。在Java中,任何Object都可以用作監視器。

對於顯示器在Java中如何工作的詳細解釋,我建議你閱讀監控力學Concurrent Programming in Java部分(前面的鏈接會顯示在谷歌圖書預覽,以及部分可用於閱讀)。

+0

正如你所說的「一個監視器是一個實體..」,這是否意味着監視器是一個內部對象/狀態,它擁有/跟蹤鎖和等待設置?如果不是,你能否在這裏詳細說明實體?基本上,當我們的java文檔說'喚醒所有等待在這個對象的監視器上的線程。關於notifyall(),我得到的是對象是維護(在內部實體/對象的幫助下)所有線程都在等待鎖,該內部實體/對象被稱爲監視器? – user3198603 2017-08-14 07:58:35

5
  1. 監視器是一種概念/機制,不限於Java語言;
  2. 「在併發編程中,監視器是一個對象或模塊,旨在被多個線程安全地使用」;
  3. 正如每位讀者所知道的,Java中的每個對象都是java.lang.Object的子類。 java人以這種方式創建了java.lang.Object,它具有使Java程序員能夠將任何對象用作監視器的特性和特性。例如,每個對象都有一個等待隊列,一個重新進入隊列以及wait和notify方法使其成爲一個監視器;
  4. 閱讀關於顯示器here
3

Java語言和運行時系統通過使用監視器支持線程同步。
監視器與特定的數據項(一個條件變量)關聯,並作爲該數據的鎖。當某個線程持有某個數據項的監視器時,其他線程被鎖定,無法檢查或修改數據。