Head First Design Pattern -》Singleton Pattern ^_^

本文介绍了单例模式的核心概念及其在程序中的应用场景,如线程池、缓存等,避免因多实例导致的问题。通过示例代码展示了两种实现方式:简单单例模式及线程安全的双重检查锁定模式。

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

1.Singleton 的核心就是-》一个类只有唯一的一个实例
2.为什么要用Singleton?
现在想想以前为什么会出现程序异常、Memory溢出、订单撞单、明明打印的是这种结果为什么却变成了不是预期的结果...等等现象,现在终于有点思路了。
总结:ThreadPool,Cache,Log,Print...像这类的类对象只能有一个实例,如果出现多个实例就会出现上述所遇到的问题。

3.单例模式的DEMO

[b]a.最简单的写法,有一个private的构造函数,有一个生成单一实例的接口[/b]

public class Singleton{
//利用静态变量来记录唯一实例
private static Singleton uniqueSingleton;

/**
*私有构造函数
*/
private Singleton(){
}

public static Singleton getInstance(){
if(null==uniqueSingleton){
uniqueSingleton=new Singleton();
}
return uniqueSingleton;
}
}

Result:上面这种单例的实现,在多线程下运行就有可能出现两个或多个实例。

[b]b.杜绝多线程访问,保持线程同步的单例模式[/b]

可能会想到Synchronized 方法同步,确实可以做到同步,但是这样会使系统的性能大大降低,所以下面有另外一种方法可以很好的解决此问题“双重检查枷锁”
public class Singleton{
//利用静态变量来记录唯一实例 枷锁
private volatile static Singleton uniqueSingleton;
/**
*私有构造函数
*/
private Singleton(){
}

public static Singleton getInstance(){

if(null==uniqueSingleton){//第一次检查
synchronized(Singleton.class){
if(null==uniqueSingleton){//第二次检查
uniqueSingleton=new Singleton();
}
}
}
return uniqueSingleton;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值