懒汉式是在调用时创建实例,用时间来换空间。  
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | class LazySingleTon {     private static volatile LazySingleTon instance;
      public static LazySingleTon getInstance(){         if (instance==null){             synchronized(LazySingleTon.class){                 if (instance == null) {                     instance = new LazySingleTon();                 }                              }         }
          return instance;     }      }
  | 
 
双重判断保证了原子性和可见性(synchronized),同时利用volatile来保证有序性,避免指令的重排。  
饿汉式在类加载的时候就已经创建好对象,在使用时直接就可以拿到实例,标准的空间换时间。  
1 2 3 4 5 6 7 8
   | class HungrySingleTon {     private static HungrySingleTon instance = new HungrySingleTon();
      public static HungrySingleTon getInstance(){         return instance;     }
  }
  | 
 
当外部类加载时不会导致内部类的立即加载,只有当getInstance方法被调用时才会去加载内部类,实现了加载。因为类的加载只会加载一次,所以它时线程安全的。  
1 2 3 4 5 6 7 8 9 10 11 12 13
   | class StaticInnerSingleTon {
      public StaticInnerSingleTon() {     }
      private static class SingleTonHolde {         private static StaticInnerSingleTon instance = new StaticInnerSingleTon();     }
      public static StaticInnerSingleTon getInstance() {         return SingleTonHolde.instance;     } }
  | 
 
1 2 3 4 5 6 7
   | enum ESingleTon {      single;
     public void singletonOperate(){        System.out.println("singletonOperate");    } }
  | 
 
     
    全文完。