繁体   English   中英

Java中静态和非静态方法之间共享的资源

[英]Resource shared between static and non-static methods in java

我知道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()调用者,而另一个线程正在使用static f2()方法递增count

在这种情况下有什么解决方案? 我是在问正确的问题吗? 并且,如果是真实情况,那么Java应当避免什么解决方案?

您可以对非静态方法使用同步块,并且它应使用与静态同步方法相同的监视器:

public void f1() {
   synchronized(Test.class) {
     count++;
   }
}

经验法则是,静态同步方法应仅用于保护静态变量,而非静态同步方法应仅用于保护非静态变量。

由于count是静态的,因此从具有非静态同步的块中对其进行修改是不正确的。 要对此进行正确编码并避免重复代码,请从f1调用f2 ,如下所示:

public void f1(){
    ... // Do something ...
    f2();
    ... // Do something else ...
}

public static synchronized void f2(){
    count++;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM