java - 在 Java 中使用 Singleton 的最佳方式

标签 java multithreading singleton utilization

假设我们在 Java 中有一个线程安全的单例类,这将是使用它的最好或更好的方法。例如,假设我们有一个 Singleton 类:

public class MySingleTon {
   // my thread-safe code goes here
}

我们有一个服务类,它以以下两种可能的方式使用上述单例:

1:

public class MyService {
   MySingleton singleton;

   public void myMethod1() {
      singleton  = MySingleton.getInstance();
      // code ...
   }

   public void myMethod2() {
      singleton = MySingleton.getInstance();
      // code...
   }
   public void myMethod3() {
      singleton = MySingleton.getInstance();
      // code...
   }
}

2:

public class MyService {

   public void myMethod1() {
      MySingleton singleton = MySingleton.getInstance();
      // code ...
   }

   public void myMethod2() {
      MySingleton singleton = MySingleton.getInstance();
      // code...
   }
   public void myMethod3() {
      MySingleton singleton = MySingleton.getInstance();
      // code...
   }
}

在情况一中,单例是通过实例变量引用的,而在情况 2 中,单例是作为方法局部变量引用的。考虑到上述两个片段都在多线程环境中使用,这是一个更好的选择,为什么?

最佳答案

我会用第三种方式定义它

public class MyService {
   final static MySingleton singleton = MySingleton.getInstance();

   public void myMethod1() {
      // code ...
   }

   public void myMethod2() {
      // code...
   }
   public void myMethod3() {
      // code...
   }
}

在所有情况下,线程安全性没有差异

关于java - 在 Java 中使用 Singleton 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28116172/

相关文章:

java - 这段 Java 代码如何编译无误?

java - 用这个实例化的单例

elasticsearch - 释放Elasticsearch连接

java - maven 中缺少 Artifact com.msg91.sendotp

java - 获取应用程序使用的jar库名称

java - 泛型删除

java - 在 Java 中,为什么我的多线程不起作用?

c# - 当 WritableBitmap.BackBuffer 在非 UI 线程中更新时应用程序停止响应?

java - java中的循环任务

java - 为什么数据库连接对象或连接池需要做成单例?