单例设计模式的实现

本文详细介绍了单例设计模式中的两种实现方式:饿汉式和懒汉式。饿汉式在类加载时就创建对象,确保唯一性;懒汉式采用延迟加载思想,在首次请求时创建对象。文中通过具体代码示例解释了每种方式的特点及应用场景。

单例设计模式的实现

1饿汉式

饿汉式就是一上来就创建对象,并且保证以后每次使用的对象都是同一个对象

package cn.tedu.design;
/**本类用于测试单例设计模式1-饿汉式*/
public class Singleton1 {
	public static void main(String[] args) {
		//6.通过类名直接调用get方法
		MySingle single = MySingle.getSingle();
		MySingle single2 = MySingle.getSingle();
		//7.测试引用类型变量保存的地址值是否一致
		System.out.println(single == single2);//true
		System.out.println(single);
		System.out.println(single2);
	}
}
//1.创建自己的单例程序
class MySingle{
	//1.提供构造方法,并将构造方法私有化
	/**1.构造方法私有化的目的:
	 * 为了不让外界随意的实例化对象/new本类对象*/
	private MySingle(){ }
	
	//2.在本类内部创建对象,并把对象私有化
	//5.2本资源也需要用static修饰,因为静态方法getSingle()只能调用静态资源
	static private MySingle single = new MySingle();
	
	/**
	 * 2.思考:对象已经创建好,并且可以用公共的方式返回
	 * 那外界如何调用这个公共的方法呢?
	 * 之前我们都是创建好本类对象,通过对象进行调用
	 * 但是现在无法在外部创建本类对象,解决方案:
	 * 我们可以利用静态,被static修饰的资源可以被类名直接调用
	 * */
	
	//3.对外提供一个公共的get(),返回本类对象给调用者
	//5.1用static修饰此方法,后续可以通过类名直接调用
	static public MySingle getSingle() {
		//4.把本类创建好的对象返回
		return single;
	}
}

image-20210717164759045

2懒汉式

1.延迟加载的思想:是指不会在第一时间为你加载资源(创建对象)而是等到你需要的时候,再帮你去加载资源(创建对象)

2.线程安全问题:多线程场景+共享数据+多条语句操作此共享数据

解决方案:加锁(同步代码块/同步方法)

3.饿汉式与懒汉式的区别:

饿汉式是不管你需不需要本类对象,先帮你创建出来

懒汉式是先不给你创建这个类的对象,等到你需要的时候再帮你创建-延迟加载

public class Singleton2 {

    public static void main(String[] args) {
        //10.测试单例的实现方式
        MySingle2 single = MySingle2.getMySingle2();
        MySingle2 single2 = MySingle2.getMySingle2();
        System.out.println(single == single2);
        System.out.println(single);
        System.out.println(single2);
    }
}

//1.创建自定义单例类
class MySingle2{
    //2.私有化构造方法--为了防止外界调用此构造创建对象
    private MySingle2(){}

    /**问题:程序中有共享资源single,并且有多条语句操作了共享资源
     * 此时共享资源single会出现多线程数据安全隐患
     * 解决方案:加锁-同步代码块-同步方法
     * (如果本方法中所有代码都被同步了,可以把本方法修饰成同步方法)
     * 锁的位置:包裹所有操作共享资源的语句
     * 锁对象:外部创建的Object对象是静态的 & 静态区域中不可以使用this
     * */

    //3.在类的内部创建一个引用类型变量--注意私有化--延迟加载
    //9.2本资源也需要使用静态修饰,因为静态资源只能调用静态
    static private MySingle2 single;

    //定义锁对象
    static Object o=new Object();

    //4.对外提供全局访问点--对外提供公共的get(),返回本类对象
    //5.当用户调用此方法时,才说明需要本类对象了,再返回
    //9.1本方法使用静态修饰,方便通过类名直接调用
    synchronized static public MySingle2 getMySingle2(){
        /**静态区域内,不能使用this关键字,因为静态资源优先于对象进行加载
         * 静态资源属于类资源,随着类的加载而加载,而this代指本类对象* */
        synchronized (o){
            if(single==null){
                single=new MySingle2();
            }
            return single;
        }
    }

}

image-20210717170749981

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值