多线程单例模式

发布时间:2026/8/14 14:01:23
多线程单例模式 设计模式作用单例模式作用实例new多个实例会报错饿汉模式1.类成员2.构造方法私有懒汉模式区别比较线程不安全时间消耗问题出现场景加锁加锁后的问题阻塞-效率解决指令重排序编译器优化3步 解决volatile面试题1.设计模式设计模式开发中有多个重复的问题场景把这些步骤总结为固定的解决方案应用在开发中。这些解决方案就是设计模式。设计模式可以提升开发效率。设计模式包含单例模式。2.单例模式单例模式一个类在当前进程中只能存在一个实例。多个进程之间无法保证只有一个实例。因为进程之间有独立的存储空间互不影响各个进程维护自己的单例对象。为什么要用到单例模式比如服务器要加载100G的数据到内存中。在代码中有一个类A的构造方法中进行上述的数据加载读硬盘文件把数据加载到内存中那么在一个对象创建好就会消耗100G内存空间。这当然是不可取的所以在应用中有些类只用创建一次就足够了只用new一次即可。但是呢人为因素不可控所以有了单例模式以确保一个进程中某个类中只有一个实例。3.饿汉模式在类加载的时候在方法区生成类对象执行初始化静态变量静态代码块。类加载JVM把.class文件加载到JVM内存上解析这个类1.触发类加载的时机—只要JVM第一次遇到这个类就触发类加载1.程序运行中第一次访问这个类的静态成员2.new这个类的对象3.反射加载这个类4.懒汉模式在类加载时部创建对象在第一次调用getInstance时才new对象。通常认为懒汉模式优于饿汉模式因为如果代码逻辑中不需要创建instance那么就省下了创建instance所用的内存空间。但是懒汉模式会出现线程安全问题。5.懒汉模式下的线程安全问题1.如图在t1执行完后最终进程里还是只有一个instance但是如果new一个对象需要花费10min又或者同一个程序里保存了两份单例对象s2修改数据s1看不到更新的数据造成业务逻辑错乱。2.3.