单例模式
立即加载(饿汉模式)
public class MyObject{ private static MyObject myObject = new MyObject(); private MyObject(){} public static MyObject getInstance(){ return myObject; } }
延迟加载(懒汉模式)(线程不安全)
public class MyObject{ private static MyObject myObject = null; private MyObject(){} public static MyObject getInstance(){ if(myObject == null){ myObject = new MyObject(); } return myObject; } }
DCL双检查锁机制(大多数多线程的解决方案)
public class MyObject{ private static MyObject myObject = null; private MyObject(){} public static MyObject getInstance(){ if(myObject == null){ synchronized (this.getClass()){ if(myObject == null){ myObject = new MyObject(); } } } return myObject; } }
静态内置类实现单例
public class MyObject{ private static class MyObjectHander{ private static MyObject myObject = new MyObject(); } private MyObject(){} public static MyObject getInstance(){ return MyObjectHander.myObject; } }
通过静态内部类的静态成员在使用时才会被初始化,而且只会被初始化一次来实现。
序列化与反序列化的单例实现(静态内置类)
参考连接 主要的原因时在反序列化时,ObjectInputeStream使用反射调用了类的默认构造函数,当实现readResolve后可自定义反序列化方法
使用static代码块和枚举类型enmu实现
其实都是利用了类型都只初始化一次的特性