栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

(Java)单例模式(饿汉式单例模式 vs 懒汉式单例模式)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(Java)单例模式(饿汉式单例模式 vs 懒汉式单例模式)

什么是设计模式?

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模免去我们自己再思考和摸索,设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,"套路”。

设计模式的分类:
① 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
② 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
③ 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式,

一.什么是单例模式?

单例模式的使用总结

单例设计模式:单例模式是指确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。

该模式有三个基本要点:
① 这个类只能有一个实例;
② 必须自行创建这个实例;
③ 提供公共的静态方法,返回内部创建的对象。
单例模式应用场景:

1.饿汉式单例模式

优点:没有任何锁,线程安全,执行效率高
缺点:类加载的时候对象就初始化,不管用不用都占内存空间
建议:
如果我们在程序启动后,一定会加载到类,那么用饿汉模式实现的单例简单又实用;
如果我们是写一些工具类,则优先考虑使用懒汉模式,可以避免提前被加载到内存中,占用系统资源。

public class SingletonTest {
	public static void main(String[] args) {
		Account account01 = Account.getInstance();
		Account account02 = Account.getInstance();
		System.out.println("account01的地址是:"+account01);	//com.jd.exer.Account@7de26db8
		System.out.println("account02的地址是:"+account02);	//com.jd.exer.Account@7de26db8
		System.out.println(account01==account02);			//地址值一样:true
	}
}
//饿汉式单例模式
class Account{
	//1.私有化类的构造器
	private Account() {
		
	}
	//2.内部创建类的私有静态对象
	private static Account instance= new Account();
	//3.提供公共的静态方法,返回创建的对象
	public static Account getInstance() {//方式1:单例模式实现
		return instance;
	}
	//方式2:改进的单例模式实现
	//public static final  Account instance= new Account();
}

运行结果:

2.懒汉式单例模式—双重检查锁

优点:延迟对象的加载,未使用时不占用内存空间
缺点:线程不安全,需要使用synchronized关键字上锁,程序性能还是存在一定的性能优化空间
建议:
如果我们在程序启动后,一定会加载到类,那么用饿汉模式实现的单例简单又实用;
如果我们是写一些工具类,则优先考虑使用懒汉模式,可以避免提前被加载到内存中,占用系统资源。

public class SingletonTest01 {
	public static void main(String[] args) {
		Order order01 = Order.getInstance();
		Order order02 = Order.getInstance();
		System.out.println("account01的地址是:"+order01);
		System.out.println("account02的地址是:"+order02);
		System.out.println(order01==order02);	//地址值一样:true	
	}
}
//懒汉式单例模式---双重检查锁
class Order{
	//1.私有化类的构造器
	private Order() {
		
	}
	//2.内部创建类的私有静态对象
	private static Order instance = null;
	//3.声明未初始化的当前类对象,提供公共的静态方法,返回创建的对象
	public synchronized static Order getInstance() {	//synchronized实现线程安全
		if(instance == null) {
			instance = new Order();
		}
		return instance;
	}
}

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463177.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号