所有同步方法的类将表现为同步块?

时间:2014-10-07 20:52:52

标签: java synchronization

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();
    }
}

3 个答案:

答案 0 :(得分:1)

答案是否定的。

同步范围是修改后的方法

请参阅http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

答案 1 :(得分:1)

有两个问题:

  

如果有两个线程,每个线程具有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用递增,则另一个线程不能调用递减。

这是正确的。当另一个线程执行decrement时,对increment的调用将被阻止。反之亦然。

  

以上代码是否等同于同步对象? [代码如下]

您的第二个示例略有不同,因为您在synchronized块中包含if语句。一般而言,如果同步块包含多个呼叫,则不等同于同步每个呼叫。

Java中没有 synchronized对象这样的东西。您同步方法或代码块。

然而,也许这就是你的意思,在你的例子中,锁都保存在同一个对象上,即调用其方法的对象的实例。因此,除了略有不同的范围外,2个示例在同一对象上以相同的方式同步。

答案 2 :(得分:0)

它正是一个同步的对象。一旦你的方法被调用,方法上的“synchronized”会锁定“this”,其他方法在方法id退出之前无法执行。