单例模式

本文介绍了单例模式的概念及其两种实现方式:饿汉式和懒汉式。通过具体代码示例对比了这两种方式的优缺点,并提供了简单的测试验证单例模式的有效性。

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

单例模式是一种很常用的模式,也是很多人都知道的一种模式,单例模式的定义是:保证一个类只有一个实例,并提供一个访问它的全局的访问点。这里的全局访问点就是我们所说的公开的静态获得实例的方法。

案例:我们创建两个类,一个类是Singleton,一个类是Consumer,并且都是单例,只允许创建一个实例。Singleton类使用单例模式中的饿汉式实现,Consumer类使用懒汉世来实现。

Singleton类如下:

public class Singleton {
	
	private static Singleton instance = new Singleton();
	
	private Singleton() {}
	
	public static Singleton getInstance() {
		return instance;
	}
}
Consumer类如下:
public class Consumer {
	
	private static Consumer instance;
	
	private Consumer() {}
	
	/**
	 * 注意多线程的情况
	 * synchronized同步,但是影响性能
	 */
	public static synchronized Consumer getInstance(){
		if (instance == null) {
			instance = new Consumer();
		}
		return instance;
	}
}
接下来测试一下:

public class Test {

	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		if (s1 == s2) {
			System.out.println(true);
		}
		
		Consumer c1 = Consumer.getInstance();
		Consumer c2 = Consumer.getInstance();
		if (c1 == c2) {
			System.out.println(true);
		}
	}

}
总结:我们的测试结果是输出两个true,但是测试不算很严格,只是单纯的测试,没有使用多线程来测试。我们来分析一下两个不同的方式实现单例的优点和缺点。饿汉式是直接创建实例,缺点是在我们还没有使用该类之前就已经有实例了,并没有在我们需要的时候创建,优点是安全,无论是多线程还是单线程,都只会创建一个实例。懒汉式的话,优点是在需要使用的时候再创建,缺点是不安全,存在安全隐患。即使使用了同步机制synchronized,在类加载的时候加锁,但是如果是跨JVM的话,就有可能出现多实例的情况。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值