懒汉式是在调用时创建实例,用时间来换空间。
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"); } }
|
全文完。