2012-04-05 33 views
4

嗨,有人可以解釋,如果在下面的代碼同步代碼將限制訪問線程。如果是,與我們使用「this」作爲監視器對象而不是「msg」有什麼不同。同步塊和監視對象

public void display(String msg)  
{  
    synchronized(msg)  
    {  
     for(int i=1;i<=20;i++)  
      {  
       System.out.println("Name= "+msg);  
      } 
    } 
} 
+0

請參閱http://stackoverflow.com/questions/574240/synchronized-block-vs-synchronized-method – 2012-04-05 19:37:48

+0

嗯......在一種情況下,您使用傳入的對象的顯示器。在另一個...你使用實例的監視器。 – 2012-04-05 19:39:39

回答

9

你寫會阻止只有當兩個線程調用該方法具有完全相同的味精對象的方法。

如果你在這個同步,那麼它只有一個線程將能夠在給定的時間調用該方法。

6
synchronized(this) 

表示僅鎖定此對象實例。如果有多個線程使用此對象實例並調用此方法,則一次只能有一個線程在同步塊內訪問。

synchronized(msg) 

表示鎖定基於msg字符串。如果您有多個線程使用此對象實例並調用此方法,則如果msg是不同實例,則多個線程可以在此同步塊內訪問。注意Java如何處理字符串相等以避免令人驚訝的效果。

+0

+1用於提及java Objects平等的效果 – 2014-09-02 10:01:55

0

如果在下面的代碼同步代碼將限制 訪問線程

是。該塊不能在同一個String對象上同時調用多次[實際上,在此String對象上同步的所有塊]。

它是如何不同,如果我們使用「這」作爲監視對象 代替「msg」中

synchronized(this)防止了由相同的對象到所有塊併發訪問,在這種情況下,該方法的對象this將不能進入同步塊兩次。

例如 [用java類僞代碼]:

s1 = s2; 
Thread1: 
MyObject o = new MyObject(); 
o.display(s1); 
Thread2: 
MyObject o = new MyObject(); 
o.display(s2); 

當前方法將不允許塊被由線程1和線程併發調用

然而:

MyObject o = new MyObject(); 
Thread1: 
o.display("s1"); 
Thread2: 
o.display("s2"); 

不會顯示它們之間的阻塞行爲 - 監視器被每個「s1」和「s2」捕獲而不會互相干擾。