关于(Java)单例的线程安全的另一个问题

时间:2014-06-06 17:42:16

标签: java thread-safety singleton

请考虑以下事项:

public class Singleton {
  private static Singleton instance;
  // NO INSTANCE VARIABLES

  private Singleton() {
    super(); // Just to have something to write here.
  }

  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }

  public String parseSomething(MyObject myObject) {
    // Do stuff
  }

  public void doAnotherThing(String value) {
    // Do something else
  }
}

parseSomething()doAnotherThing()线程安全吗?换句话说,如果我有多个线程获取Singleton实例并且可能同时调用这两个方法,它会终止生命吗?

我的直觉(和有限的经验)说“不”,因为这些方法不会对其范围之外的任何事情采取行动;它们不会在Singleton中的任何实例变量中携带状态。每个调用线程都有自己的堆栈中的参数和本地范围的变量,所以(理论上)它们不应该碰撞。

不幸的是,我似乎无法向Google提出有关此主题的任何问题涉及Singleton中的状态承载实例变量上的实例方法的某些操作。

修改:再次尝试instance。不过,我真正的问题是,假设N个线程在instance上有句柄,并且正在调用parseSomething()doAnotherThing(),他们会互相谋杀吗?

1 个答案:

答案 0 :(得分:0)

  

parseSomething()和doAnotherThing()是否是线程安全的?

高度依赖于他们做什么以及他们如何做,单例模式,与线程安全无关,它应该保证在该对象中只有一个实例运行系统,顺便说一下这个实现没有(你可以创建另一个Singleton实例,使用反射,或者如果在getInstance调用中并行调用getInstance)。

因此,如果此方法是无状态的,并且没有任何共享状态,那么它们是线程安全的。你可以在单例类中使这些方法保持静态,并从这个Singleton中创建一个实用程序类。