挑灯夜读——java设计模式:单例模式

本文探讨了设计模式中的两种单例模式——饿汉模式和懒汉模式。饿汉模式在类加载时即完成初始化,可能导致空间浪费;而懒汉模式则延迟加载,但在多线程环境下可能存在安全问题。为解决这一问题,文中展示了使用双重检查锁定和volatile关键字的改进版懒汉模式,确保线程安全。通过对这两种模式的分析,加深了对单例模式的理解。
摘要由CSDN通过智能技术生成

设计模式

  • 为什么要学习这个设计模式呢?其实刚学习的时候,也没有多加考虑,只是在学习过程中,了解到我们的设计过程中,必然会产生一些编码规范和习惯,而这些习惯和规范,就由国外的GoF (Goup of four)四人帮组合,编写和统计而成。一共有23中设计模式。太多太多,后面会就几个比较典型的设计模式进行学习和讲解。

饿汉模式

  • 听听名字就知道,是一个十分急切的设计模式,而它的特点就是在对象初始化时便加载出来,结构如下:
public class HungryMan{
	private HungryMan(){
	}
	//下面便是对其的加载和初始化过程
	private final static HungryMan hungryman = new HungryMan();
	private static HungryMan getInstance(){
		return hungryman;
	}
	//想象以下,假如有下面的一些变量需要初始化
	private int[] arr = new int[1024];
	private int[] arr1 = new int[1024];
	private int[] arr2 = new int[1024];
	//我们可能并没有使用该变量,但是我们已经分配了空间给它们 
}
  • 所以上面的饿汉模式的主要缺点为:空间的浪费

懒汉模式

  • 懒汉和饿汉又有了本质的区别,懒汉主要是懒惰,也就是加载变量不会像饿汉一样。
  • 【补充】一个对象被new之后经历了三个过程:
1、分配内存空间
2、加载构造函数,初始化值
3、将对象指向该内存空间
  • 而我们的懒汉如下:
public class LazyMan {
    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"ok");
    }
    private volatile static LazyMan lazyMan;

    public static LazyMan getInstance(){    
        lazyMan = new LazyMan();
        return lazyMan;
   }
}
  • 以上为懒汉模式,需要使用时,只需要调用getInstance()方法,进行对象的创建。
  • 上面的模式会出现一个问题,就是我们的多线程情况下的安全问题。
public class LazyMan {
    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+"ok");
    }
    private volatile static LazyMan lazyMan;

    public static LazyMan getInstance(){
        if(lazyMan==null){
            synchronized (LazyMan.class){
                if(lazyMan==null){
                    lazyMan = new LazyMan();
                    /*
                    * 1、分配内存空间
                    * 2、执行构造函数、初始化对象
                    * 3、将对象指向引用
                    */
                }
            }
        }
        return lazyMan;
    }
}
  • 上面是我们对其加入的synchronized锁,将类对象锁住,并且在内外添加了两层判断机制,确保我们的加载不会出现多次加载,且加载的对象不同。并且我们添加了volatile关键字在类对象前面,确保我们的对象可见性和指令不可重排等。

结语:

  • 本次总结内容不多,但是个人理解比较通透,希望有所帮助。
  • 提前批还未打算尝试,最近的目标就是设计模式、JUC和spring ,加油哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米店不卖你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值