我已經閱讀了不同的博客中關於監視器的不同的東西。所以現在有點困惑。java線程中的「監視器」
據我所知,monitor是一個確保只有一個線程在關鍵部分執行代碼的人。因此,如果我們有3個同步的方法/塊,那麼我們將有3個監視器來確保只有一個線程在關鍵部分。
如果以上情況屬實,那麼爲什麼說Java中的每個對象都有一個與之關聯的監視器。它應該是每個同步塊都與監視器關聯。
我已經閱讀了不同的博客中關於監視器的不同的東西。所以現在有點困惑。java線程中的「監視器」
據我所知,monitor是一個確保只有一個線程在關鍵部分執行代碼的人。因此,如果我們有3個同步的方法/塊,那麼我們將有3個監視器來確保只有一個線程在關鍵部分。
如果以上情況屬實,那麼爲什麼說Java中的每個對象都有一個與之關聯的監視器。它應該是每個同步塊都與監視器關聯。
什麼是監視器?
監視器是一個線程可以抓住並保持的東西,防止所有其他線程抓住同一個監視器並迫使它們等待,直到監視器被釋放。這是塊的功能。
這些顯示器來自哪裏?
答案是:從任何Java對象。當你寫:
Object foo = new Object();
synchronized (foo) {
System.out.println("Hello world.");
}
...這是什麼意思是:當前線程會先搶存儲在變量foo
對象相關聯的監視並保持它,而它輸出「Hello World」,然後將其釋放。
爲什麼每個Java對象都有一個與之關聯的監視器?
沒有技術上的理由。這是一個在Java早期版本中做出的設計決定,現在改變已經太遲了(儘管它最初令人困惑,而且如果人們不小心會造成問題)。
那麼在同步方法的情況下會發生什麼,我們沒有與它關聯的對象,所以沒有使用監視器? –
@DeepakKumar一個'synchronized'方法od等同於'synchronized(this){}',而靜態同步方法使用類對象作爲其監視器。 – biziclop
感謝您的回覆。如果我問了這麼多問題,我還有最後一件事,並且很抱歉。如果我沒有弄錯,靜態同步方法與類對象無關。那麼在這種情況下,我們如何能夠將類對象作爲監視器? –
使用帶有塊的時,指定要鎖定的對象。在這種情況下,該對象的監視器用於鎖定。
將與方法一起使用時,您不指定要鎖定的對象,而是隱含this
對象。再次,this
的監視器用於鎖定。
因此,對象具有監視器,同步方法/塊沒有自己的監視器,而是使用特定對象的監視器。
是的,但是每個同步塊都有一個與之相關聯的監視器(通過'synchronized(monitor){...}'聲明,並且該監視器是一個對象 –
所以你說monitor只不過是共享資源我們正在嘗試訪問? –
您可以將monitor作爲對象的一部分,它可以記住哪個線程當前正在執行同步的塊,還可以記住線程進入同步塊的次數(基於同一個監視器) -entrant lock)監視器還記得當前正在等待的其他線程的列表,以通知它們應該繼續它們的代碼 – Pshemo