1

有什么区别:

public synchronized void test(){}

public void test() {
   synchronized(Sample.class){}
}
4

3 回答 3

5

为了使区别更清楚,第一个可以重写为:

public void test() {    
   synchronized(this){    
   }    
}

不同之处在于第一个在类的实例上同步,而第二个在类本身上同步。

在第一种情况下,两个线程可以同时test()在类的两个实例上执行。第二,他们不能。

于 2014-12-07T07:31:49.723 回答
1

声明一个实例方法synchronized只是相当于拥有一个synchronized (this)块的语法糖。换句话说,只有一个线程可以在单个时间点对该实例执行该方法。

synchronized (Sample.class)意味着这个类的所有实例共享一个锁对象(类对象本身),并且只有单个线程可以在单个时间点对任何实例执行此方法。

于 2014-12-07T07:34:12.297 回答
1

完成@NPE的回答 -

synchronized方法实际上是该synchronized方法“所属”的对象上的方法。无论是实例对象还是类对象本身。

所以:

class Sample {
    public synchronized void test(){}
}

相当于

class Sample {
    public void test() {
        synchronized(this) {}
    }
}

尽管

class Sample {
    public void test() {
       synchronized(Sample.class){}
    }
}

相当于:

class Sample {
    public static synchronized void test(){}
}
于 2014-12-07T10:08:18.887 回答