在Java中使用Singleton的最佳方法

时间:2015-01-23 18:14:40

标签: 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中,单例被引用为方法局部变量。考虑到上述两个片段都用于多线程环境,这是一个更好的选择,为什么?

2 个答案:

答案 0 :(得分:2)

我会以第三种方式定义

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

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

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

在所有情况下,线程安全性没有区别

答案 1 :(得分:0)

在我看来,

2会更好。它允许MySingleton自由地杀死单例实例并在需要时重新创建(即自我检测死锁或资源争用缓解)。