我有一个问题:我们可以将static
关键字与synchronized
一起使用吗?
方法?众所周知, static 与类相关,同步用于阻止对象,使用synchronized
和static
对我没有任何意义。那么为什么以及在哪种情况下我会使用static
关键字同步?
答案 0 :(得分:8)
在java中,静态内容在方法定义的类对象上同步,
例如
static synchronized void aMethod() {}
相当于
static void aMethod() {
synchronized(YourClass.class){
}
}
synchronized方法在执行之前获取锁(第17.1节)。对于 一个类(静态)方法,与Class对象关联的锁 使用方法的类。对于实例方法,锁定 与此相关联(调用该方法的对象)是 使用
OP的问题:
为什么我使用静态同步和“情况”?
情况是防止多个Thread同时执行静态方法。
答案 1 :(得分:2)
我认为这会对你有所帮助:
对于那些不熟悉的人,静态同步方法被锁定在类对象上,例如对于字符串类String.class
,而实例同步方法锁定由this
表示的当前Object实例。
由于这两个对象都不同,因此它们具有不同的锁,因此当一个线程正在执行静态同步方法时,另一个线程不需要等待该线程返回。相反,它将获取由.class
文字表示的单独锁,并进入静态同步方法。
这甚至是一个流行的多线程访谈问题,面试官询问特定方法被锁定在哪个锁上,有些时候也出现在Java测试文件中。
public class SynchornizationMistakes {
private static int count = 0;
//locking on this object lock
public synchronized int getCount(){
return count;
}
//locking on .class object lock
public static synchronized void increment(){
count++;
}
}