public class SynchronizedCounter {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public synchronized int value() {
return c;
}
}
如果有两个线程,每个线程具有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用递增,则另一个线程不能调用递减。以上代码是否等同于同步对象?即。
public void run(){
synchronised( objectReferenceSynchronisedCounter){
if(conditionToIncrement)
objectReference....Counter.increment();
else
objectReference....Counter.decrement();
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
有两个问题:
如果有两个线程,每个线程具有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用递增,则另一个线程不能调用递减。
这是正确的。当另一个线程执行decrement
时,对increment
的调用将被阻止。反之亦然。
以上代码是否等同于同步对象? [代码如下]
您的第二个示例略有不同,因为您在synchronized块中包含if语句。一般而言,如果同步块包含多个呼叫,则不等同于同步每个呼叫。
Java中没有 synchronized对象这样的东西。您同步方法或代码块。
然而,也许这就是你的意思,在你的例子中,锁都保存在同一个对象上,即调用其方法的对象的实例。因此,除了略有不同的范围外,2个示例在同一对象上以相同的方式同步。
答案 2 :(得分:0)
它正是一个同步的对象。一旦你的方法被调用,方法上的“synchronized”会锁定“this”,其他方法在方法id退出之前无法执行。