我知道static
synchronized
方法锁定在class
对象上,而实例synchronized
方法锁定在Object的当前实例上this
。
由于这两个对象都不相同,因此它们具有不同的锁,因此当一个线程正在执行static
synchronized
方法时,java中的其他线程不需要等待该线程返回,而是将获得单独的锁。
考虑以下示例
public class Test {
static int count = 0;
public synchronized void f1(){
count++;
}
public static synchronized void f2(){
count++;
}
}
这里共享计数不是以互斥方式访问的,这可能导致在另一个线程使用方法递增时,错误count
地传递给的调用方。f1()
count
static
f2()
在这种情况下有什么解决方案?我是在问正确的问题吗?并且,如果是真实情况,那么Java应当避免什么解决方案?
您可以在非静态方法上使用同步块,并且它应该使用与静态同步方法相同的监视器:
public void f1() {
synchronized(Test.class) {
count++;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句