2014-10-07 105 views
0
public class SynchronizedCounter { 
private int c = 0; 

public synchronized void increment() { 
    c++; 
} 

public synchronized void decrement() { 
    c--; 
} 

public synchronized int value() { 
    return c; 
} 
} 

如果有兩個線程,每個線程都有SynchronizedCounter實例,這是否意味着如果一個線程正在調用increment,另一個線程不能調用遞減。上面的代碼是否等同於一個同步對象?即同步所有方法的類將表現爲同步塊?

public void run(){ 
    synchronised(objectReferenceSynchronisedCounter){ 
     if(conditionToIncrement) 
     objectReference....Counter.increment(); 
     else 
     objectReference....Counter.decrement(); 
    } 
} 
+4

不,因爲'if'部分在第一種情況下不同步。 – njzk2 2014-10-07 20:54:36

+0

@ njzk2好的,也許我有兩個runnables,一個遞增,另一個遞減。沒有,如果聲明。 – Kraken 2014-10-07 20:56:01

+0

另請參閱http://stackoverflow.com/questions/417285/equivalent-code-for-instance-method-synchronization-in-java – lexicore 2014-10-07 20:56:30

回答

1

有2個問題:

如果有兩個線程,每個線程有SynchronizedCounter的同一個實例,這是否意味着,如果一個線程是調用增量,其他的不能打電話遞減。

這是正確的。 decrement的呼叫將被阻止,而另一個線程執行increment。反之亦然。

上述代碼是否等價於一個同步對象? [代碼如下]

你的第二個例子稍有不同,因爲你在synchronized塊中包含了一個if語句。一般來說,如果一個同步塊包含多個呼叫,則它不等同於每個單獨的呼叫同步。

在Java中沒有像同步對象這樣的東西。您可以同步方法或代碼塊。

但是,也許這就是你的意思,在你的兩個例子中,鎖被保存在同一個對象上,即其方法被調用的對象的實例。因此除了略有不同的範圍外,這兩個示例在同一個對象上以相同的方式進行同步。

0

正是同步對象。方法的「同步」鎖定「this」一旦你的方法被調用,其他方法不能執行,直到方法id退出。