标签:Lazy getInstance 创建 Hungry instance StaticInnerClass 实例 单例 设计模式
设计模式——创建型之单例模式
一个类自我实例化,不对外暴露实例化接口,且保证对外提供的实例相同,这种创建对象的模式叫单例模式
单例模式减少了全局对象的创建和销毁次数,节省系统资源
1、实现方式
在类加载时就创建实例
1.1、饿汉式
1.1.1、普通实现
public class Hungry {
//1、通过类加载的双亲委派模型,保证初始化单一实例
private static Hungry instance = new Hungry();
//2、限制构造函数私有化,保证外部无法构造新实例
private Hungry(){}
public static Hungry getInstance(){
return instance;
}
}
Hungry instance = Hungry.getInstance()
1.1.2、枚举
public enum EnumClass {
INSTANCE;
}
EnumClass instance = EnumClass.INSTANCE;
1.2、懒汉式
使用时才创建类实例
1.2.1、双重检测
public class Lazy {
//1、类加载时并不初始化实例
private static Lazy instance;
//2、限制构造函数私有化,保证外部无法构造新实例
private Lazy(){}
//3.1、如果synchronized修饰getInstance方法,无论实例是否创建都会加锁,影响性能,所以放在方法体中
//3.2、如果不在内层进行实例判空,多个线程可能会同时通过外层判空直接创建实例,导致单例失效,所以采用两次判空
public static Lazy getInstance(){
if(instance == null){
synchronized (Lazy.class){
if(instance == null){
instance = new Lazy();
}
}
}
return instance;
}
}
Lazy instance = Lazy.getInstance();
1.2.2、静态内部类
public class StaticInnerClass {
//1.1、外部类加载时,内部类并不会一起加载,保证实例懒加载
private static class StaticInnerClassHolder{
private static StaticInnerClass instance = new StaticInnerClass();
}
private StaticInnerClass(){}
public static StaticInnerClass getInstance(){
return StaticInnerClass.getInstance();
}
}
StaticInnerClass instance = StaticInnerClass.getInstance();
2、唯一性
传统的单例对象是进程内(应用)唯一的
实现线程内唯一可以使用ThreadLocal
实现进程间(集群、分布式)唯一可以将对象序列化并加分布式锁
标签:Lazy,getInstance,创建,Hungry,instance,StaticInnerClass,实例,单例,设计模式 来源: https://blog.csdn.net/weixin_39841589/article/details/111770266
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。