Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于(Java)单例线程安全性的另一个问题_Java_Thread Safety_Singleton - Fatal编程技术网

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

关于(Java)单例线程安全性的另一个问题,java,thread-safety,singleton,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) {

考虑以下几点:

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
中的任何实例变量中都不携带状态。每个调用线程在自己的堆栈中都有参数和局部作用域变量,因此(理论上)它们不应该冲突

不幸的是,在这个主题上,我似乎无法用谷歌搜索出任何不涉及实例方法对
Singleton
中携带实例变量的状态执行某些操作的问题

编辑:再次尝试
实例
操作。不过,我这里真正的问题是,假设N个线程在
实例上有一个句柄
,并且正在调用
parseSomething()
doAnotherThing()
,它们会相互残杀吗

parseSomething()和doNothing()是否线程安全

在很大程度上取决于它们做什么和如何做,单例模式与线程安全无关,它应该保证在运行的系统中只有一个对象实例,而这个实现并没有(您可以使用反射创建另一个Singleton实例,或者如果在getInstance调用中并行调用getInstance)


因此,如果这些方法是无状态的,并且没有任何共享状态,那么它们是线程安全的。您可以在您的singleton类中使这些方法成为静态的,并从这个singleton类中生成一个实用程序类。

甚至
getInstance
都不是线程安全的。也许我通过添加singleton方面使事情变得过于复杂了。这个场景是真实的ly just“N个线程在对象的同一个实例上有一个句柄,它们都在调用其实例方法。如果这些实例方法不访问它们自己范围之外的任何变量,那么它们是线程安全的吗?”@RandomHuman:如果它们不共享任何状态,它们是否访问其他外部资源(文件、套接字等)(包括文件、套接字、e.t.c.),它们是线程安全的,如果您提供代码而不是guessing@ninjalj我必须在那里看一分钟我的真实代码,但是没有。在这种情况下没有外部依赖关系。实例方法中的所有代码只作用于传入的参数或本地实例化的变量。