//经典实现方式,但是在多线程环境下就会出问题,
//可能连个线程同时进入了uniqueInstance==null那条控制路径
public class Singletion
 {
      private static Singletion uniqueInstance;
      private Singletion()
 {
     } //
      public static Singletion
 getInstance() {
           if (uniqueInstance == null)
 { // 延迟实例化,懒汉式
               uniqueInstance = new Singletion();
          }
           return uniqueInstance ;
     }
}
 
//对方法加锁,同步线程对其的调用
//但是只有第一次执行getInstance时,才真正需要同步,其他时候都是对性能的损耗
public class Singletion2
 {
      private static Singletion2 uniqueInstance;
      private Singletion2()
 {
     }
      // 每次都需要同步
      public static synchronized Singletion2
 getInstance() {
           if (uniqueInstance == null)
 {
               uniqueInstance = new Singletion2();
          }
           return uniqueInstance ;
     }
}
----------
//使用“急切”创建实例(饿汉式),JVM会在线程方位这个静态变量之前,一定先创建这个实例,所以线程安全。
//缺点是不是在需要的时候才创建实例
public class Singletion3
 {
      private static Singletion3 uniqueInstance = new Singletion3();
      private Singletion3()
 {
     }
      // 每次都需要同步
      public static synchronized Singletion3
 getInstance() {
           return uniqueInstance ;
     }
}
-------
//利用双重检查加锁,在getInstance方法中减少使用同步,用
public class Singletion4
 {
      private static Singletion4 uniqueInstance;
      private Singletion4()
 {
     }
      // 每次都需要同步
      public static synchronized Singletion4
 getInstance() {
           if (uniqueInstance == null)
 {
               uniqueInstance = new Singletion4();
          }
           return uniqueInstance ;
     }
}