Singleton-六种单例模式特点

本文详细介绍了五种单例模式的实现方式及其特点,包括饿汉模式、懒汉模式的不同变种及Holder模式,并对每种模式的优缺点进行了对比分析。

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

package com.xiawei.singleton;
/**
* 第一种
* 饿汉模式</p>
* 核心思想是:类加载时初始化单利 </p>
* 优缺点:线程安全。浪费资源</p>
* 适用范围:适用多线程</p>
*/
public class SingletonA {

private static final SingletonA singletonA = new SingletonA();

public SingletonA() {}

public static SingletonA getSingletonA(){

return singletonA;

}


}

 

===================================================================

package com.xiawei.singleton;
/**
* 第二种
* 饱汉模式</p>
* 核心是:懒加载 </p>
* 优缺点:线程不安全,节省资源 </p>
* 适用范围:单线程
*/
public class SingletonB {

private static SingletonB singletonB = null;

public SingletonB() {}

public static SingletonB getSingletonB(){
if(singletonB == null){
singletonB = new SingletonB();
}
return singletonB;
}

}

 

==================================================================

package com.xiawei.singleton;
/**
* 第三种
* 饱汉模式_变形1</p>
* 核心思想:懒加载 </p>
* 优缺点:线程安全,并发性差 </p>
*/
public class SingletonC {

private static SingletonC singletonC = null;

public SingletonC() {}

public static synchronized SingletonC getSingletonC(){
if(singletonC == null){
singletonC = new SingletonC();
}
return singletonC;

}
}

 

==========================================================================

package com.xiawei.singleton;
/**
* 第四种
* 饱汉模式_变形2 </p>
* 核心是:懒加载
* 优缺点:线程安全,控制了并发性
*/
public class SingletonD {

private static SingletonD singletonD = null;

public SingletonD() {}

public static SingletonD getSingletonD(){
if(singletonD == null){
synchronized(SingletonD.class){
if(singletonD == null){
singletonD = new SingletonD();
}
}
}
return singletonD;

}
}

 

==============================================================================

package com.xiawei.singleton;
/**
* 第五种
* 饱汉模式_变形3 </p>
* 核心思想是:懒加载 </p>
* 优缺点:线程安全,节省资源 </p>
* 适用范围:适用于多线程敏捷环境
*
*/
public class SingletonE {

private static volatile SingletonE singletonE = null;

public SingletonE() {}

public static SingletonE getSingletonE(){
if(singletonE == null){
synchronized(SingletonE.class){
if(singletonE == null){
singletonE = new SingletonE();
}
}
}
return singletonE;

}

}

 

/**
* 这里补充一下关于volatile关键字的理解:

*上面用到了一个关键字volatile ['vɑlətl],在java语言中volatile可以保证内存可见性,禁止指令重排等.
* 这里提到可见性,那么什么是可见性呢?所谓可见性是指线程之间的可见性,一个线程修改的状态对另一个
* 线程是可见的也就是一个线程修改的结果,另一个线程马上就能看到。
* 看一下它的实现原理:
* 当对一般普通变量进行读写操作时,每个线程都是从其主内存copy变量到本地CPU缓存中,如果我们
* 的计算机有多个CPU,每个线程可能在不同的CPU上被处理,也就是每个线程可以copy到不同的CPU
* cache(高速缓冲存储器)中。volatile修饰的变量不会被缓存在寄存器或其他处理器不可兼得地方,这样保证了每次
* 读写变量都是从主内存中读,跳过CPU cache这一步当一个线程改变了这个变量的值新值对于其他线程是立即可知的
*
*
*/

==============================================================================

package com.xiawei.singleton;
/**
* Holder模式 </p>
* 核心思想:懒加载+静态变量 </p>
* 优缺点:线程安全,节省资源,可读性好 </p>
* 适用范围:适用于多线程
*/
public class SingletonF {

static class SingletonHolder{

private static final SingletonF singletonF = new SingletonF();

public SingletonHolder() {}

}

public SingletonF() {}

public synchronized static SingletonF getSingletonF(){

return SingletonHolder.singletonF;

}

}

转载于:https://www.cnblogs.com/xiaweicn/p/8666516.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值