Python 官方文档:入门教程 => 点击学习
目录1、简介2、单例模式——懒汉式3、单例模式——饿汉式总结1、简介 单例模式使⽤场景: 业务系统全局只需要⼀个对象实例,⽐如发号
单例模式使⽤场景:
spring ioc
容器中的 Bean 默认就是单例。 @Autowire
的依赖注⼊对象默认都是单例的。单例模式分类:
public class SingletonLazy {
// 当需要用到该实例的时候再创建实例对象
private static SingletonLazy instance;
private SingletonLazy() {
}
public void process() {
System.out.println("方法实例化成功!");
}
public static SingletonLazy getInstance() {
if (instance == null) {// 实例为null时候才创建
instance = new SingletonLazy();// 当需要的时候再进行实例化对象
}
return instance;
}
public static synchronized SingletonLazy getInstance2() {
if (instance == null) {// 实例为null时候才创建
// 方法上加synchronized锁后可以保证线程安全
instance = new SingletonLazy();// 当需要的时候再进行实例化对象
}
return instance;
}
public static SingletonLazy getInstance3() {
if (instance == null) {// 实例为null时候才创建
// 局部加锁后可以保证线程安全,效率较高
// 缺陷:假设线程A和线程B
synchronized (SingletonLazy.class){
// 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
// 当A线程执行完毕后,B再获得执行权,这时候还是可以实例化该对象
instance = new SingletonLazy();// 当需要的时候再进行实例化对象
}
}
return instance;
}
}
对于上面方式三存在的缺陷,我们可以使用双重检查锁定的方式对其进行改进:
public static SingletonLazy getInstance3plus() {
if (instance == null) {// 实例为null时候才创建
// 局部加锁后可以保证线程安全,效率较高
// 假设线程A和线程B
synchronized (SingletonLazy.class){// 第一重检查
// 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
// 当A线程执行完毕后,B再获得执行权,这时候再判断instance == null是否成立
// 如果不成立,B线程无法 实例化SingletonLazy
if (instance == null){// 第二重检查
instance = new SingletonLazy();// 当需要的时候再进行实例化对象
}
}
}
return instance;
}
再次升级方式三,来解决内存模型中的指令重排问题:
// 添加volatile 关键字,禁止实例化对象时,内存模型中出现指令重排现象
private static volatile SingletonLazy instance;
public static SingletonLazy getInstance3plusplus() {
if (instance == null) {// 实例为null时候才创建
// 局部加锁后可以保证线程安全,效率较高
// 假设线程A和线程B
synchronized (SingletonLazy.class){// 第一重检查
// 当线程A获得锁的执行权的时候B等待 A执行new SingletonLazy();实例化
// 当A线程执行完毕后,B再获得执行权,这时候再判断instance == null是否成立
// 如果不成立,B线程无法 实例化SingletonLazy
if (instance == null){// 第二重检查
instance = new SingletonLazy();// 当需要的时候再进行实例化对象
}
}
}
return instance;
}
单例模式——懒汉式调用:
@Test
public void testSingletonLazy(){
SingletonLazy.getInstance().process();
}
public class SingletonHungry {
// 当类加载的时候就直接实例化对象
private static SingletonHungry instance = new SingletonHungry();
private SingletonHungry(){}
public void process() {
System.out.println("方法实例化成功!");
}
public static SingletonHungry getInstance(){
return instance;// 当类加载的时候就直接实例化对象
}
}
@Test
public void testSingletonHungry(){
SingletonHungry.getInstance().process();
}
饿汉式单例模式,当类加载的时候就直接实例化对象,因此不需要考虑线程安全问题。
懒汉与饿汉式如何选择?
文章会不定时更新,有时候一天多更新几篇,如果帮助您复习巩固了知识点,还请支持一下,后续会亿点点的更新!希望大家多多关注编程网的其他内容!
--结束END--
本文标题: java面试常见模式问题---单例模式
本文链接: https://lsjlt.com/news/127894.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0