1.请问Singleton2,和Singleton3的是否相同,
2.另外Singleton3中的语句"static { instance =  new Singleton3(); }",在java中的术语叫什么,
我自己从语句理解为静态匿名方法,不过查了许多书好象没有此叫法吧????,(本人刚学java对一些语法和术语不太了解)3.网上的许多文章都说Singleton2的实现比较安全(多线程中),不过我想如果有多个线程同时定义
Singleton2,如 线程1代码中 有Singleton2 s1的代码,同时线程2代码中也有Singleton2 s2,这种
情况下JVM会如何处理
public class Singleton1 {
private static Singleton1 instance = null; private Singleton1() {
}; public static synchronized Singleton1 getInstance() {
if (instance == null)
instance = new Singleton1();
return instance;
}
}public class Singleton2 {
private Singleton2() {
} private static Singleton2 instance = new Singleton2(); public static Singleton2 getInstance() {
return instance;
}}public class Singleton3 {
private Singleton3() {
} static Singleton3 instance;  public static Singleton3 getInstance() {
return instance;
}

static { instance =  new Singleton3(); }
}

解决方案 »

  1.   

    1,同
    2,静态代码段
    3,同进程线程共享。
    OVER
      

  2.   

    1.2和3一样
    2.静态代码段,装载类的时候就直接执行了
    3.不管几个线程,instance 只有一个
      我不太明白:Singleton2的实现为什么比较安全
      

  3.   

    1,2两种方法从功能实现上来说区别不大。
    第一种方法称为延迟构造或者懒汉构造,也就是只有调用getInstance()的时候才会构造实例。
    这种方法的缺点就是为了线程安全,getInstance()使用了synchronized,降低了性能.
    第二种方法(与第三种方法是一样的)就相对美观一些,并且没有synchronized,性能优化一些.推荐如下方法:
    public class Singleton4{
      private Singleton4(){}
      private static class Inner{
        static Singleton4 instance=new Singleton4();
      }
      public static Singleton4 getInstance(){
        return Inner.instance;
      }
    }
    既省略了synchronized,又实现了延迟构造
      

  4.   

    修改了一下,防止使用clone()出现多个实例.
    public final class Singleton4{
      private Singleton4(){}
      private static class Inner{
        static final Singleton4 instance=new Singleton4();
      }
      public static Singleton4 getInstance(){
        return Inner.instance;
      }
    }