常见的物种单例模式实现方式:
——主要:
饿汉式(线程安全,调用效率高,但是,不能延迟加载)
懒汉式(线程安全,调用效率不高,但是,可以延迟加载)
——其他
双重检测锁式(由于JVM底层内部模式原因,偶尔会出现问题,不建议使用)
静态内部类式(线程安全,调用效率高,但是,可以延时加载)
枚举式(线程安全,调用效率高,不能延迟加载)
如何选用?
——单例对象占用资源少,不需要延时加载
枚举式好于饿汉式
——单例对象占用资源大,需要延时加载
静态内部类好于懒汉式
/**
* 单例模式 饿汉式
* @author 万河归海
*
*/
public class Singpattern01 {
//类初始化时,立即加载到这个对象(没有延时加载的优势),加载类是,线程是安全的
private static Singpattern01 instance = new Singpattern01();
private Singpattern01(){//构造方法私有化
}
//方法没有同步,调用效率高!
public static Singpattern01 getSingpattern01(){
return instance;
}
}
/**
* 单例模式懒汉式
* @author 万河归海
*
*/
public class Singpattern02 {
//类初始化时,不初始化这个对象(有延时加载的优势)
private static Singpattern02 instance;
private Singpattern02(){
}
//方法同步,调用效率低
public static synchronized Singpattern02 getSingpattern02(){
if(instance==null){
instance = new Singpattern02();
}
return instance;
}
}
public class Singpattern03 {
/**
* 单例模式 内部类实现方式
* @author 万河归海
*要点: 外部类没有static属性,则不会像饿汉式那样立即加载对象。
* 只有真正调用getInstance(),才会加载静态内部类。加载类时时线程安全的。
* instance是static final类型,保证了内存中只有一个实例存在,而且只能被赋值一次
* 从而保证了线程安全
* 兼备了并发高效调用和延迟加载的优势
*/
private static class SingletonIntance{
private static final Singpattern03 instance = new Singpattern03();
}
public static Singpattern03 getInstance(){
return SingletonIntance.instance;
}
private Singpattern03(){
}
}
/**
* 使用枚举实现单例模式
* @author 万河归海
* 优点:实现简单
* 枚举本身就是单例模式。由JVM从根本上提供保障!避免反射和反序列化的漏洞!
* 缺点:无延迟加载
*/
public enum Singpanttern04 {
//这个枚举元素,本身就是单例对象!
INSTANCE;
//可以添加自己需要的操作!
public void singletonOperation(){
}
}
由于双重检测锁式的局限性,再次就不书写其代码了,如想了解,请自行度娘即可。