2014-06-18 74 views
0

運行同步方法會將其對象的鎖定給調用該方法的對象。通過運行其同步方法獲取對象的鎖

在代碼this Q, 我是否需要同步塊上 - 對象c本身或其他任何東西?

setInt()是一種同步方法。

c.setInt(c.getInt()+k); 

當調用setInt(),是因爲setInt()獲得的c鎖的線synch'd和 鎖沒有之前setInt()返回釋放。這是整個塊,無需牛逼同步它(?)

所以,

c.setInt(c.getInt()+k); 

,如果我在下面的代碼中註釋掉「行-A」 &「線路B」仍然會被同步。 setInt()在這裏同步,getInt()不是:

public void update(SomeClass c) { 

    while (<condition-1>) // the conditions here and the calculation of 
           // k below dont have anything to do 
           // with the members of c 
     if (<condition-2>) { 
      // calculate k here 
      synchronized (c) {  // Line-A     
        c.setInt(c.getInt()+k); 
       // System.out.println("in "+this.toString()); 
      }      // Line-B 
     } 
} 

這讓我一直很好奇。

TIA

+1

不這麼用噸同一個問題的問題淹沒。順便說一下,我給了你[回答你的第一個問題](http://stackoverflow.com/a/24281311/2711488),這使得所有其他的kludges不必要的。 – Holger

回答

2

你提的問題是很難理解,但我認爲你是問你是否被鎖定爲有完整的調用序列,得到的回答是,你是不是。有效地你已經把相同:

int tmp = c.getInt(); // will lock and then unlock c 
tmp += k; 
c.setInt(tmp); // will lock and then unlock c. 

這就是爲什麼正確的線程安全的,你需要做哪既get和一個synchronized塊內設置的增量方法。

c.increment(k); 
+0

或者只是使用AtomicInteger:P –

+0

@omu_negru是的,這對於這個特定的情況會更好。在一般情況下,您需要理解此行爲才能正確執行線程。 –

+0

我從setInt()中調用getInt()。 getInt不同步,getInt()爲 – Roam