设计模式--单例模式
程序员文章站
2022-04-15 19:19:21
设计模式–单例模式单例模式1.作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。2.优点:由于单例模式只产生一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。3.常见的五种单例模式实现方式:饿汉式单例模式:/**********************...
设计模式–单例模式
单例模式
1.作用:
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
2.优点:
由于单例模式只产生一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。单例模式可以在系统设置全局的访问点,优化环共享资源访问,例如可以设计一个单例类,负责所有数据表的映射处理。
3.常见的五种单例模式实现方式:
饿汉式单例模式:
/************************************饿汉式单例模式***************************************/
public class SingleDemo1 {
//类初始化时立即加载这个对象(private确保不被调用,static全局声明实例,自己的类里声明初始化时立即加载)
//即刻加载确保了加载的线程是安全的
private static SingleDemo1 instance =new SingleDemo1();
//私有化构造方法
private SingleDemo1() {}
//将类初始化就加载的对象可间接被调用(public 确保可以被外界调用该方法,static确保得到实例唯一)
//唯一,不同步,调用效率高
public static SingleDemo1 getInstance() {
return instance;
}
}
/***************************************************************************************/
懒汉式单例模式:
/************************************懒汉式单例模式***************************************/
public class SingleDemo2 {
//private私有变量,static全局变量,类中声明实例初始化时自动创建对象,但没有直接生成内存空间,提高了资源利用率
private static SingleDemo2 s;
//私有化构造方法
private SingleDemo2() {};
//public全局声明,static唯一实例,synchronized实现代码同步(一个线程正在访问,其他线程只能等待)使得并发效率降低
//内部if判定,当s未被实例化的时候才创建对象,延迟加载,只有在用的时候才加载!
public static synchronized SingleDemo2 getInstance() {
if(s==null) {
s=new SingleDemo2();
}
return s;
}
}
/***************************************************************************************/
双重检索式单例模式
/************************************双重检测锁式单例模式***************************************/
public class SingleDemo3 {
//由于JVM底层内部模型原因,偶尔会出现问题,不建议使用
//类初始化时立即加载这个对象(private确保不被调用,static全局声明实例,自己的类里声明初始化时立即加载)
//初始化为空,方便后续判定。if的应用确保了只执行一次,也就是synchronized(SingleDemo3.class)同步化只进行一次
private static SingleDemo3 instance=null;
public static SingleDemo3 getInstance() {
if(instance==null) {
SingleDemo3 sc;
synchronized(SingleDemo3.class) {
sc=instance;
if(sc==null) {
synchronized(SingleDemo3.class) {
if(sc==null) {
sc=new SingleDemo3();
}
}
instance=sc;
}
}
}
return instance;
}
private SingleDemo3() {}
}
/**********************************************************************************************/
静态内部类单例模式(强烈推荐)
/************************************静态内部类单例模式***************************************/
public class SingleDemo4 {
//静态内部类单例模式兼备了并发高效调用和延迟加载的优势。
//外部类没有static属性,因此不会立即加载对象
private static class SingletonClassInstance{
//static确保变量唯一,final确保只能被赋值一次,确保线程的安全
private static final SingleDemo4 instance =new SingleDemo4();
}
//只有真正调用getInsatance()才会加载静态内部类,加载类时线程是安全的
public static SingleDemo4 getInstance() {
return SingletonClassInstance.instance;
}
//私有化构造方法
private SingleDemo4() {}
}
/*******************************************************************************************/
枚举单例模式
/************************************枚举实现单例模式***************************************/
//enum枚举缩写
public enum SingleDemo5 {
//实现简单,枚举本身就是单例模式。由JVM在根本上提供保障!避免通过反射和反序列化的漏洞!但是无延迟加载
//这个枚举元素本身就是单例
INSTANCE;
//添加自己需要的操作
public void singletonOperation() {
}
}
/*****************************************************************************************/
4.总结
饿汉式(线程安全,调用效率高。但是,不能延迟加载。)
懒汉式(线程安全,调用效率不高。但是,可以延迟加载。)
其他:
双重检测锁式(由于JVM底层内部模型原因,偶尔会出现问题,不建议使用)
静态内部类式(线程安全,调用效率高。但是,可以延迟加载)
枚举单例(线程安全,调用效率高,不能延迟加载)
本文地址:https://blog.csdn.net/weixin_45476753/article/details/107352128