标签:Singleton 模式 instance 实例 static private 单例 设计模式
设计模式之单例模式
1.设计目的
为了限制类的对象被随意的创建,需要保证该类的构造器方法是私有的。通过单例模式可以创建该类的全局访问点。
2.设计方法
1.饿汉式
饿汉式单例模式是指在类创建的时候就把该类的一个对象加载到内存中,使用getInstance()方法获取该对象。
//饿汉式单例模式代码
public class Singleton{
//首先创建实例
private static Singleton instance = new Singleton();
//私有化构造器方法
private Singleton(){}
//获取实例方法
public static Singleton getInstance(){
return instance;
}
}
饿汉式的实现是线程安全的,但是会影响性能。
2.懒汉式
懒汉式单例模式是将实例延迟创建,只有在第一次使用该类时才会去实例化。
//懒汉式单例模式代码
public class Singleton{
//首先创建instance空引用
private static Singleton instance = null;
//私有化构造器方法
private Singleton(){}
//获取实例方法
public static Singleton getInstance(){
if(instance == null){
//创建实例
instance = new Singleton();
}
//已有实例
return instance;
}
}
但是,懒汉式单例模式不是线程安全的,两个线程同时进行该操作时,
if(instance == null){
//创建实例
instance = new Singleton();
}
一个线程尚未实例化对象,另一个线程也判断出instance是null,此时两个线程会同时创建对象,破坏了单例模式的特点。
有以下几个方式解决懒汉式的线程安全问题:
1)为getInstance()方法添加synchronized关键字,保证该方法同时只能被一个线程访问
//懒汉式单例模式代码
public class Singleton{
//首先创建instance空引用
private static volatile Singleton instance = null;
//私有化构造器方法
private Singleton(){}
//获取实例方法
public static synchronized Singleton getInstance(){
if(instance == null){
//创建实例
instance = new Singleton();
}
//已有实例
return instance;
}
}
但是该方法在高并发的情况下会降低性能,只需要将synchronized关键字加在创建实例代码块上即可。
2)Double-checked locking方法
//懒汉式单例模式代码
public class Singleton{
//首先创建instance空引用
private static volatile Singleton instance = null;
//私有化构造器方法
private Singleton(){}
//获取实例方法
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
//创建实例
instance = new Singleton();
}
}
}
//已有实例
return instance;
}
}
volatile关键字保证了instance的内存可见性
3)Initialization on demand holder(内部类方法)
//懒汉式单例模式代码
public class Singleton{
//私有化构造器
private Singleton(){}
//内部类
private static class LazyHolder{
private static final Singleton singletonInstance = new Singleton();
}
public static Singleton getInstance(){
return LazyHolder.singletonInstance;
}
}
3.总结
单例模式的创建方法有两种,依据是否延迟创建分为饿汉式和懒汉式,懒汉式具有线程不安全的问题,可以通过sychronized关键字、Double-checked locking、内部类方法解决。此处讨论的单例模式仅限于在同一个JVM中保证一个类只有一个实例。
标签:Singleton,模式,instance,实例,static,private,单例,设计模式 来源: https://blog.csdn.net/weixin_44866550/article/details/120231346
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。