Java 所有方法都已同步的类将作为同步块运行?

Java 所有方法都已同步的类将作为同步块运行?,java,synchronization,Java,Synchronization,如果有两个线程,每个线程都有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用increment,另一个线程就不能调用Decreation。上述代码是否等同于同步对象?i、 e public class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() {

如果有两个线程,每个线程都有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用increment,另一个线程就不能调用Decreation。上述代码是否等同于同步对象?i、 e

public class SynchronizedCounter {
private int c = 0;

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

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

public synchronized int value() {
    return c;
}
}
答案是否定的

同步作用域是修改后的方法


请参见

它正是一个同步对象。方法上的“synchronized”锁定“this”,一旦调用了一个方法,其他方法将无法执行,直到方法id退出。

有两个问题:

如果有两个线程,每个线程都有相同的SynchronizedCounter实例,这是否意味着如果一个线程正在调用increment,另一个线程就不能调用Decreation

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

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

您的第二个示例略有不同,因为您在同步块中包含了一个if语句。一般来说,如果一个同步组包含多个调用,它并不等同于同步每个单独的调用

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


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

否,因为在第一种情况下,
if
部分没有同步。@njzk2 Ok,所以可能我有两个可运行项,一个递增,另一个递减。No if语句。另请参见您的代码不完整,但似乎预期的答案是:否,因为在第一个版本中,线程可以在方法调用之间抢占(
increment
decrement
),另一个可以执行
increment
,如果您的条件不依赖于对象的状态,或者更一般地说,如果您不将状态从一个调用拖到另一个调用,则代码不相同,但可能具有相同的结果。尤其是当您不是多线程时:)
public void run(){
    synchronised( objectReferenceSynchronisedCounter){
        if(conditionToIncrement)
        objectReference....Counter.increment();
        else
        objectReference....Counter.decrement();
    }
}