2014-02-22 54 views
0

我只是想進一步理解這個概念。在顯示器上同步

我們有一個監視器,讓我們說一個隊列或某種地圖。該監視器具有放置對象的方法,並可以關閉對象。爲了線程安全,監視器將鎖定它的put方法並且獲取方法。當一個線程與該監視器同步時,它會不斷嘗試獲取此監視器的權限,以便能夠繼續執行所需的操作。這聽起來正確嗎?

另一個問題,控制流程如何在這裏工作。線程訪問監視器後執行哪個代碼?我發現很難用打印語句來調試多線程程序,它會變得非常混亂和混亂。

public void run(){ 
    try{ 
     synchronized (monitor){ 
      while (monitor is empty){ 
       monitor.wait(); // Does this line pause the thread or the monitor? 
      } 

      System.out.println("Done Waiting"); 
     } 
     System.out.println("Out of the synchronized block"); 
    } 
} 
+1

不要這樣想。監視器沒有方法或字段或任何東西。監視器不是你可以與之交互的東西。你與對象交互。對象有監視器。 –

回答

3

下面是來自Java Language Specification定義:

Java編程語言提供了多種機制 線程之間進行通信。這些方法中最基本的是使用監視器實現的 同步。 Java中的每個對象 都與一個線程可以鎖定或解鎖的顯示器相關聯。 一次只有一個線程可能會在監視器上鎖定一個鎖。嘗試鎖定該監視器的任何其他 線程都會被阻止,直到它們可以在該監視器上獲取鎖定爲 。線程t可能會多次鎖定某個特定的監視器;每次解鎖都會反轉一個鎖的效果 操作。

要回答

本顯示器的方法將物體放在,並獲得對象了。在 爲了線程安全,監視器將鎖定它的放置方法,並在其上獲取方法 。當一個線程與這臺顯示器同步時,它不斷地嘗試獲得這臺顯示器的權利,所以 可以繼續執行它所需要的操作。這聽起來正確嗎?

所以你沒有與顯示器進行交互。監視器沒有方法的概念。不要這樣想。您與具有監視器的對象進行交互。當一個線程獲取一個對象的監視器時,它不需要經常試圖獲取它,它已經有了它

另一個問題,控制流程如何在這裏工作。線程訪問監視器後,將執行哪個代碼 ?我是 發現很難調試多線程程序只是打印 陳述,它會變得非常混亂和混亂。

如果執行進入一個物體上的​​塊,當前執行的線程已經獲取監視器​​對象上,在這種情況下,由可變monitor引用的對象。

我假設(感謝Radiodeaf)通過monitor is empty,您的意思是您的Map對象沒有任何條目。

當你調用

monitor.wait(); 

當前線程釋放由monitor引用的對象上保持監視器和休眠,直到它得到通知。

該javadoc的Object#wait()有更多的細節。

因此,您將循環檢查是否爲空,並等待它返回true。我們可以假設其他一些代碼在Map中插入某些內容時會調用notify()

當對象得到通知時,線程必須競爭重新獲取對象的監視器。這顯然是必要的,以便線程可以在對象的​​塊內執行。

+0

*「我不知道你的意思是監視器是空的」* OP的監視器對象是一個Map。 (這是在他們的另一個問題。) – Radiodef

+0

@Radiodef謝謝,我已經編輯,以反映這一點。 –

0

正如我們所知我們只能從同步上下文中調用wait方法。 所以通過說等待釋放鎖,我們的意思是說,一旦在同步上下文中獲取對象的鎖時,通過調用同一對象上的等待方法,釋放鎖並允許其他線程在該對象上工作。

相關問題