立即加载(饿汉模式)
立即加载是指使用类的时候已经将对象创建完毕
延迟加载(懒汉模式)
延迟加载是指调用get()方法时实例才被工厂创建
延迟加载(懒汉模式)的缺点
多线程的时候可能会导致建立多个对象,而非单例模式
延迟加载(懒汉模式)的解决方案
- 声明synchronized关键字
- 尝试使用同步代码块
- 针对某些重要代码进行单独同步
- 使用DCL(Double-Check Locking,双检查锁)机制来实现多线程环境中的延迟加载单例模式
- DLC使用volatile的必要性(防止代码重排序)
使用静态内置类实现单例模式
public class MyObeject{
private static class MyObjectHandler{
private static MyObject myObject = new MyObject();
}
private MyObject(){
}
public static MyObject getInstance(){
return MyObjectHandler.myObject;
}
}
序列化和反序列化的单例模式实现
在反序列化时使用readResolve()方法,对原有的MyObject对象进行复用
使用static代码块实现单例模式
public class MyObeject{
private static MyObeject instance = null;
private MyObject(){
}
static{
instance = new MyObeject();
}
public static MyObject getInstance(){
return instance;
}
}