2015-10-06 79 views
3

我已經閱讀了不同的博客中關於監視器的不同的東西。所以現在有點困惑。java線程中的「監視器」

據我所知,monitor是一個確保只有一個線程在關鍵部分執行代碼的人。因此,如果我們有3個同步的方法/塊,那麼我們將有3個監視器來確保只有一個線程在關鍵部分。

如果以上情況屬實,那麼爲什麼說Java中的每個對象都有一個與之關聯的監視器。它應該是每個同步塊都與監視器關聯。

+2

是的,但是每個同步塊都有一個與之相關聯的監視器(通過'synchronized(monitor){...}'聲明,並且該監視器是一個對象 –

+0

所以你說monitor只不過是共享資源我們正在嘗試訪問? –

+1

您可以將monitor作爲對象的一部分,它可以記住哪個線程當前正在執行同步的塊,還可以記住線程進入同步塊的次數(基於同一個監視器) -entrant lock)監視器還記得當前正在等待的其他線程的列表,以通知它們應該繼續它們的代碼 – Pshemo

回答

4

什麼是監視器?

監視器是一個線程可以抓住並保持的東西,防止所有其他線程抓住同一個監視器並迫使它們等待,直到監視器被釋放。這是​​塊的功能。

這些顯示器來自哪裏?

答案是:從任何Java對象。當你寫:

Object foo = new Object(); 
synchronized (foo) { 
    System.out.println("Hello world."); 
} 

...這是什麼意思是:當前線程會先搶存儲在變量foo對象相關聯的監視並保持它,而它輸出「Hello World」,然後將其釋放。

爲什麼每個Java對象都有一個與之關聯的監視器?

沒有技術上的理由。這是一個在Java早期版本中做出的設計決定,現在改變已經太遲了(儘管它最初令人困惑,而且如果人們不小心會造成問題)。

+0

那麼在同步方法的情況下會發生什麼,我們沒有與它關聯的對象,所以沒有使用監視器? –

+1

@DeepakKumar一個'synchronized'方法od等同於'synchronized(this){}',而靜態同步方法使用類對象作爲其監視器。 – biziclop

+0

感謝您的回覆。如果我問了這麼多問題,我還有最後一件事,並且很抱歉。如果我沒有弄錯,靜態同步方法與類對象無關。那麼在這種情況下,我們如何能夠將類對象作爲監視器? –

2

使用帶有塊的​​時,指定要鎖定的對象。在這種情況下,該對象的監視器用於鎖定。

將​​與方法一起使用時,您不指定要鎖定的對象,而是隱含this對象。再次,this的監視器用於鎖定。

因此,對象具有監視器,同步方法/塊沒有自己的監視器,而是使用特定對象的監視器。