Java单例模式(饿汉式,懒汉式),我更愿称作(传统销售式,饥饿营销式)
Posted summer-yuf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java单例模式(饿汉式,懒汉式),我更愿称作(传统销售式,饥饿营销式)相关的知识,希望对你有一定的参考价值。
单例模式是一个很经典的设计模式,在java中无处不在。比如spring中的bean注入,工具类的编写等。
但是在刚接触单例模式时候,我总对这个饱汉式和饿汉式的称呼理解不好。下面来讲一讲我自己的理解。
1)饿汉模式(传统销售式)
class A{ private A(){} private static A instance = new A();//这里更像传统销售产品,加载类时,先把商品(实例)准备好 public static A getInstance(){ return instance;//传统的销售模式,我已经准备好商品了,你需要,我直接给你。 } } !注意:该模式如果A类中的东西很多,那么创建A对象时所花时间更多(整个类的加载变慢了)
2)懒汉模式(饥饿营销式)
class A{ private A(){} private static A instance; public static A getInstance(){//在加载类的时候不创建A对象,不生产B商品,在有人预定的时候,再去生产(创建A对象) if(instance == null){ //买家1(线程1) 买家2(线程2) instance = new A();//这里就会有线程安全问题,如果买家1预定了,A对象还没生成完,买家2又开始预定,那么就会生成两个不同的A,破坏了单例。 } return instance; } } !!!注意:该模式存在线程安全问题 解决方式:添加synchronized关键字到静态方法,参数传入(A.class),或者在if语句外,添加synchronized静态代码块
以上是关于Java单例模式(饿汉式,懒汉式),我更愿称作(传统销售式,饥饿营销式)的主要内容,如果未能解决你的问题,请参考以下文章
Java 设计模式 -- 单例模式的实现(饿汉式枚举饿汉式懒汉式双检锁懒汉式内部类懒汉式)jdk 中用到单例模式的场景DCL实现单例需用volatile 修饰静态变量