TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
下面我谈谈我对单例模式的看法。逐一分析单例模式的陷阱,帮助大家正确使用单例模式。
(1) 陷阱一:调用函数的性能瓶颈
在c++中,单例只有一种实现方式――LazySingleton, 实现如下(本文全部使用java代码): public class LazySingleton {
private static LazySingleton m_instance = null ;
private LazySingleton(){};
synchronized public static LazySingleton getInstance(){
if(m_instance!=null)
m_instance=new LazySingleton();
return m_instance;
}
}
-
- LazySingleton将对象的初始化推迟到调用的时候。并且为了防止多线程环境下产生多个实例,使用synchronized
- 关键字保证函数getInstance调用的线程安全。synchronized关键字的存在保证了只会产生一个对象,但也成了多
- 线程环境下的性能瓶颈。一个多线程的程序,到了这里却要排队等候成了一个单线程式的执行流程,这在高并发环
- 境下是不可容忍的。而c++中可以使用双重检查机制将这种性能问题仅仅限制在第一次构造对象的时候,而java中
- 不可以使用双重检查机制。
- 但是java可以实现EagerSingleton,实现如下:
复制代码 public class EagerSingleton {
private static EagerSingleton m_instance = new EagerSingleton();
private EagerSingleton(){};
public static agerSingleton getInstance(){
return m_instance;
}
}
与LazySingleton相比,EagerSingleton将对象的初始化放到了类加载的时候。这样就避免了synchronized关键字的性能瓶颈。
|
|