如何使单例类线程安全?

时间:2009-09-30 07:39:04

标签: java class singleton class-design

我在Java中实现一个单例类,以确保只创建了一个类的实例。

6 个答案:

答案 0 :(得分:11)

制作单身人士的最佳方式?使用枚举。

public enum Singleton {
    INSTANCE;
    public void foo(){ ... }
}

// Usage:
Singleton.INSTANCE.foo();

您可以从VM获得大量帮助,不仅可以避免双重实例化,还可以帮助您避免反序列化损坏。

答案 1 :(得分:6)

也许最好的方法是使用带有单个实例的枚举。这样做的另一个好处是可序列化并保证对序列化和反射的单一性,这没有“直截了当”的Singleton实现(私有?我有反思,我嘲笑你的访问修饰符!)。它的实现也非常简单:

public enum Singleton {
    INSTANCE;

    // fields and methods go here
}

答案 2 :(得分:2)

public class Singleton {
  public static final Singleton INSTANCE = new Singleton();
  private Singleton() { ... }
}

使用静态实例变量比内部“Holder”类更受欢迎。如果您愿意,您也可以将静态成员设为私有,并提供访问它的方法,但所有这一切都是向堆栈添加另一个方法调用。

答案 3 :(得分:1)

lazy instanciation:getInstance()返回单例,如果是第一次调用则创建它。

 public class MySingleton
 {
     private static MySingleton instance;

     private MySingleton()
     {
         // construct object . . .
     }

     // For lazy initialization
     public static synchronized MySingleton getInstance()
     {
         if (instance==null)
         {
             instance = new MySingleton();
         }
         return instance;
     }

     // Remainder of class definition . . .
 } 

答案 4 :(得分:0)

单身人士默认情况下不是线程安全的。创建单例的常用方法是使用一个工厂方法来处理一个实例的创建。这样你就可以控制实例的创建。

答案 5 :(得分:0)

如果您关心并发,则不会使用共享全局状态。