【问题标题】:Resource shared between static and non-static methods in javajava中静态方法和非静态方法之间的资源共享
【发布时间】:2013-12-20 10:52:05
【问题描述】:

我知道staticsynchronized 方法锁定在class 对象上,而实例synchronized 方法锁定在对象的当前实例上,即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 会避免什么解决方案?

【问题讨论】:

    标签: java multithreading synchronization static-methods static


    【解决方案1】:

    您可以在非静态方法上使用同步块,它应该使用与静态同步方法相同的监视器:

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

    【讨论】:

      【解决方案2】:

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

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

      public void f1(){
          ... // Do something ...
          f2();
          ... // Do something else ...
      }
      
      public static synchronized void f2(){
          count++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-06
        • 2011-06-02
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        相关资源
        最近更新 更多