【问题标题】:Thread safety, static methods and some weird code线程安全、静态方法和一些奇怪的代码
【发布时间】:2018-07-13 14:03:12
【问题描述】:

我最近偶然发现了一段类似于下面的代码。这段代码确实很臭。看起来像单例,但不是因为没有私有构造函数。我确定这将有足够大的负载给它带来线程安全问题。专门给定的类实例。有人可以指出这段代码的线程安全问题吗?

public class AClass extends AnotherClass {

  public static final AClass instance = new AClass();

  public static SomeObject doSomethingThatCallsAService(Params params) {
       return methodThatCallsService(params, instance);
  }

  public static SomeObject methodThatCallsService(Params params, AClass instance) {
      -----call service here ---------
      instance.doSomethingElse();
  }

  private void doSomethingElse() {
      --- do some trivial work -----
  }
}

【问题讨论】:

  • 对象没有状态。线程安全问题从何而来?
  • 感谢欧内斯特,问题是当对静态方法进行多次调用时会发生什么,该静态方法正在访问声明为静态的类的本地实例。

标签: java static thread-safety singleton


【解决方案1】:

鉴于对象不携带状态,因此无需担心线程安全,无论有多少线程调用方法或引用单例对象。

类中的所有方法,包括静态方法,不使用任何共享数据。因此,无论是调用单例对象的方法还是传递实例,都无需访问要同步的任何内容。

正如代码所示,唯一可能可能需要同步的数据是methodThatCallsService 的参数中的params,并且只有在此方法修改数据并且多个线程持有引用的情况下到同一个Params 对象。

但就这个类而言,它是线程安全的,即使单例实现易受攻击。

【讨论】:

  • 以防万一,如果单例有一些变异变量,那么他的担忧是正确的,但是看看示例代码,你的答案是完美的。
  • 如果params 变量被读取和修改,那么可能会出现问题。由于我们没有看到params 的任何用法,我们只能猜测
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多