当两个线程同时访问时,下面的代码将停止破坏单例

时间:2016-11-18 10:20:41

标签: java singleton

public class javaprac1 {

    private javaprac1() {

    }

   static private javaprac1 instance = new javaprac1();

   public static javaprac1 getInstance(){

       return instance; 
   }

}

5 个答案:

答案 0 :(得分:3)

是。这是一个非懒惰的单例,它是最简单的,并且是线程安全的,没有任何额外的诡计。唯一的“缺点”是它没有懒惰的初始化,但往往似乎懒得过分强调。当单例执行一些可能很重的初始化时,Lazy-init是首选,并且您希望将它推迟到第一次使用时。

如果您需要一个懒惰的单身,请使用Enum singleton模式,这也非常简单。

答案 1 :(得分:0)

如果你的意思是' ..停止单身.. ' - 答案是。但如果您的意思是此代码线程安全' (我怀疑你的意思) - 答案是

更好/最新的方法将是ujsing single value enum singleton。其他答案真的很好。

谢谢你@kayaman,我今天学到了一些东西。

答案 2 :(得分:0)

是。 但至于你的方法(第一种方法),你可以让你的私人领域最终。

因此,对javaprac1.getInstance的所有调用都返回相同的对象引用,并且不会创建其他javaprac1实例

<强>例如

public class javaprac1 {

    private javaprac1() {

    }

   static private final javaprac1 instance = new javaprac1();

   public static javaprac1 getInstance(){

       return instance; 
   }

}


对于第二种方法,请同时填写final字段public并进行调用。您无需创建getInstance方法。

<强>例如

public class javaprac1 {

    private javaprac1() {

    }

   static public final javaprac1 instance = new javaprac1();

}


对于第三种方法, Enum singleton - 首选方法(请参阅Effective Java- Item3)。

<强>例如

public enum javaprac1 {
   INSTANCE;  

}

答案 3 :(得分:0)

我问两个线程是否同时访问代码会创建两个对象。答案是我不相信人民给出的答案。

由于

答案 4 :(得分:-1)

如果你问的是你的实现是否是线程安全的,我会说它实际上是线程安全的

无论如何,我用这种方式将它与延迟初始化结合起来:

public class javaprac1 {

    private javaprac1() {}

    static private javaprac1 instance = null;

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