java设计模式——单例模式

本文介绍了单例模式的概念及其两种常见实现方式:懒汉式和饿汉式。对比了两者在线程安全性和效率上的区别,并提供了具体的代码示例。

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

一、什么是单例模式?

保证在一个jvm中只能有一个实例。

二、单例的几种写法?

单例一共有7种写法,今天的介绍中我们只介绍两种,感兴趣的老铁们可以私底下了解其他的。

三、懒汉式和饿汉式。

区别:

懒汉式:线程不安全、效率低;

饿汉式:线程安全、效率高。

原因(原理):

懒汉式:需要时才被实例化,之后都是用的同一个实例;

饿汉式:class文件被加载时就实例化了。

四、代码演示

1.懒汉式:

public class Singleton {
	//只能有一个实例
	private static Singleton singleton = null; 
	//私有化构造器
	private Singleton(){}
	
	//获取实例的方法
	static public Singleton getInstance(){
		if (singleton==null) {
			//保证线程安全
			synchronized (Singleton.class) {
				singleton = new Singleton();
			}
		}
		return singleton;
	}
	
	/*说明:
	 * 			Singleton通过将构造方法限定为private避免了类在外部被实例化,
	 * 		在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
	 * 		(事实上,通过Java反射机制是能够实例化构造方法为private的类的,
	 * 		那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,
	 * 		姑且掩耳盗铃地认为反射机制不存在。)
	 */
}
说明:因为new一个对象的时候可能会发发生线程安全问题,所以在getInstance这个方法new对象的时候加个synchronizated关键字,保证线程安全。所以在这里给刚毕业找工作的大学生建议笔/面试过程中有需要手写单例模式的时候写懒汉式的,这样可以显得你懂得比别人稍微多,在线程安全的方面面试官会不断挖掘你,同事线程安全问题也是非常重要的。
	2.饿汉式
public class Singleton2 {
	
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//私有化构造器
	private Singleton2() {
	}
	
	//创造实例化对象
	private static Singleton2 singleton2 = null;
	//获取实例的方法
	public static Singleton2 getSingleton2(){
		if (singleton2==null) {
			singleton2 = new Singleton2();
		}
		return singleton2;
	}

	//测试
	public static void main(String[] args) {
		Singleton2 s1 = Singleton2.getSingleton2();
		s1.setName("123");
		System.out.println(s1.getName());
		Singleton2 s2 = Singleton2.getSingleton2();
		s2.setName("1234");
		System.out.println(s2.getName());
		//测试创建的是不是同一个对象---true是同一个对象
		System.out.println(s1==s2);
	}
}



	小结:虽然单例很简单但是工作中会用到不少,所以希望大家对简单的东西能够达到精通。还有在平时的学习中多比较的去学习这样对新知识的掌握会更加牢固,对以后的使用也会更加的得心应手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值