有什么区别:
public synchronized void test(){}
和
public void test() {
synchronized(Sample.class){}
}
有什么区别:
public synchronized void test(){}
和
public void test() {
synchronized(Sample.class){}
}
为了使区别更清楚,第一个可以重写为:
public void test() {
synchronized(this){
}
}
不同之处在于第一个在类的实例上同步,而第二个在类本身上同步。
在第一种情况下,两个线程可以同时test()
在类的两个实例上执行。第二,他们不能。
声明一个实例方法synchronized
只是相当于拥有一个synchronized (this)
块的语法糖。换句话说,只有一个线程可以在单个时间点对该实例执行该方法。
synchronized (Sample.class)
意味着这个类的所有实例共享一个锁对象(类对象本身),并且只有单个线程可以在单个时间点对任何实例执行此方法。
完成@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(){}
}