单例模式

本文深入探讨了单例模式的两种实现方式:饿汉式和懒汉式。详细介绍了每种方式的特点,包括线程安全性、资源加载时机及性能表现等,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解决的问题:可以保证一个类在内存中的对象唯一性

对象唯一性

1.不允许其他程序用new创建对象。

2.在该类创建一个本类实例。

3.对外提供一个方法让其他程序可以获得该对象。

步骤:

1.私有化该类构造函数。

2.通过new在本类中创建一个本类对象。

3.定义一个共有的方法,将创建的对象返回。


饿汉式:(饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。)

public class Singleton {
	// 在类初始化时,已经自行实例化
	private Singleton() {
	};

	private static final Singleton single = new Singleton();

	public static Singleton getInstance() {
		return single;
	}
}

懒汉式:(线程不安全)

public class Singleton {
	// 在第一次调用的时候实例化自己
	private Singleton() {
	};

	private static Singleton single = null;

	public static Singleton getInstance() {
		if (single == null) {
			single = new Singleton();
		}
		return single;
	}
}
懒汉式(在getinstance上加上synchroized)

public class Singleton {
	// 在第一次调用的时候实例化自己
	private Singleton() {
	};

	private static Singleton single = null;

	public static synchronized Singleton getInstance() {
		if (single == null) {
			single = new Singleton();
		}
		return single;
	}
}

懒汉式(双重锁定)

public class Singleton {
	// 在第一次调用的时候实例化自己
	private Singleton() {
	};

	private static Singleton single = null;

	public static Singleton getInstance() {
		if (single == null) {
			synchronized (Singleton.class) {
				if (single == null) {
					single = new Singleton();
				}
			}
		}
		return single;
	}
}

懒汉式(静态内部类)(推荐)

public class Singleton {
	private static class LazyHolder {
		private static final Singleton INSTANCE = new Singleton();
	}

	private Singleton() {

	}

	public static final Singleton getInstance() {
		return LazyHolder.INSTANCE;
	}
}


主要区别:

线程安全:

饿汉式天生就是线程安全的。

懒汉式本身是非线程安全的。

资源加载和性能:

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,

但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次调用时要做初始化,

如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值