版权声明:转载附链接并联系 https://blog.csdn.net/BigCabbageFy/article/details/79778960
所谓单例模式就是不管你此时new多少新对象,它只会创建出一个对象供你使用。
最基础的两种单例模式是:饿汉式和懒汉式。
而还有三种常见的单例模式:双重检测锁模式、静态内部类实现和枚举类实现模式。
懒汉式:
/**
* 测试懒汉式单例模式
* 延时加载,用到了才创建对象,提高了资源的利用率。
* 但由于需要用到同步,导致并发效率很低。
* @author Administrator
*/
public class SingletonDemo2 {
private static SingletonDemo2 s2;
//构造器私有化
private SingletonDemo2() {
}
//这里要加上同步,否则不能实现单例
public static synchronized SingletonDemo2 getInstance() {
//判断s2是否为空,如果为空,则创建一个新对象。
if(s2 == null) {
s2 = new SingletonDemo2();
}
return s2;
}
}
饿汉式:
/**
* 测试饿汉单例模式
* 饿汉式单例模式无延时加载。
* @author Administrator
*/
public class SingletonDemo1 {
//在创建对象的时候用类加载器初始化,
//类加载器在加载的时候是一个天然的线程安全
//不需要用保持同步来保证线程安全
private static SingletonDemo1 instanc = new SingletonDemo1();
private SingletonDemo1(){
}
//随用随加载,无延时
public static SingletonDemo1 getInstanc() {
return instanc;
}
}
双重检测锁:
-由于JVM底层内部模型原因,偶尔会出问题,不建议使用。所以相应代码不在这里显示了。
静态内部类实现:
/**
* 测试静态内部类实现方式
* 延迟加载
* 线程安全
* 并发高效调用
* @author Administrator
*/
public class SingletonDemo3 {
//静态内部类,并私有化
private static class SingletonDemo3ClassInstance{
private static SingletonDemo3 instance = new SingletonDemo3();
}
//没有同步,调用效率高
public static SingletonDemo3 getinstance() {
return SingletonDemo3ClassInstance.instance;
}
private SingletonDemo3(){
}
}
枚举类:
/**
* 枚举式实现单例模式
* 线程安全
* 防止反射和反序列化操作破解
* 无延时加载
* @author Administrator
*/
public enum SingletonDemo4 {
//枚举元素是天然的线程安全
INSTANCE;
}
总结如下:
常见的五种单例模式实现方式
主要:
-饿汉式(线程安全,调用效率高;但是不能延时加载)
-懒汉式(线程安全,调用效率不高,但是可以延时加载)
其他:
-双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
-静态内部类式(线程安全,调用效率高,但是,可以延时加载)
-枚举类(线程安全,调用效率高,防反射和反序列化,不能延时加载)
如何选用?
-单例对象 占用资源少,不需要延时加载时:
枚举类 好于 饿汉式
-单例对象 占用资源大,需要延时加载时:
静态内部类式 好于 懒汉式
五种方式效率测试: