说明
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。
单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。
示例
下面看下单例模式的代码实现
1 | class Singleton{ |
如果使用if (!self::$instance){
会有线程安全问题
- a. A、B线程同时进入了getInstance
- b. A首先进入if判断,由于instance为null,所以它执行self::$instance = new self();
- c. 由于内存的优化机制,会先划出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时内存没有开始初始化这个实例),然后A离开了if代码块。
- d. B进入if判断,由于instance此时不是null,因此它马上离开了if代码块并将结果返回给调用该方法的程序。
- e. 此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
改为if (!self::$instance instanceof self){
即可
总结
单例模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。