设计模式之单例模式(懒汉式与饿汉式)

懒汉式

一,定义与类型

定义:保证一个类仅有一个实例,并提供一个全局访问点
类型:创建型

二,适用场景

确保任何情况下绝对只有一个实例
线程池,数据库连接池用单例设计

三,优点:

1.在内存中只有一个实例,减少内存开销
2.避免对资源多重占用
3.设置全局访问点,严格控制访问

四,缺点;

没有接口,扩展困难

五,重点:

1.私有构造器
2.线程安全
3.延迟加载
4.序列化和反序列化安全
5.反射(防止)

六,实用技能

1.反编译
2.内存原理
3.多线程Debug

七,代码演示

1.懒汉式以及多线程Debug
单线程安全,代码演示

public class LazySingleton {
    //声明静态的要被单例的对象
    private static LazySingleton lazySingleton=null;
    //私有构造器,为了不让外部new 
    private LazySingleton(){} 
    //获取对象的方法
    public static LazySingleton getInstance(){
        if(lazySingleton==null){
            lazySingleton=new LazySingleton();
        }
        return lazySingleton;
    }
}

单线程安全测试

public class Test {
    public static void main(String[] args) {
        LazySingleton lazySingleton=LazySingleton.getInstance();
        System.out.println("program end");
    }
}

断点调试后结果:
在这里插入图片描述
在这里插入图片描述
多线程不安全,代码演示
线程类

public class T implements Runnable {
    @Override
    public void run() {
        LazySingleton lazySingleton=LazySingleton.getInstance();
        System.out.println(Thread.currentThread().getName()+" "+lazySingleton);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        //LazySingleton lazySingleton=LazySingleton.getInstance();
        Thread t1=new Thread(new T());
        Thread t2=new Thread(new T());
        t1.start();
        t2.start();
        System.out.println("program end");
    }
}

运行时线程安全
在这里插入图片描述
多线程Debug调试
在这里插入图片描述
挂起方式选thread,可手动调节
在这里插入图片描述
在这里插入图片描述
如图,两个线程创建了不同的实例

八,改进方案

在这里插入图片描述

饿汉式

public class HungrySingleton {
    private final static HungrySingleton hungrySingleton;
    static {
        hungrySingleton=new HungrySingleton();
    }
    private HungrySingleton(){
        
    }
    public static HungrySingleton getInstance(){
        return hungrySingleton;
    }
}
发布了146 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43689040/article/details/103545906