独一无二的对象。
和全局变量有什么区别?
全局变量:程序一开始就创建好对象,对象可能非常消耗资源,而程序在这次执行构成中一次也没有使用。
我们来看一下最简单的一个单例模式:
public class Singleton {private static Singleton uniqueInstance;private Singleton() {}public static Singleton getInstance() {if (uniqueInstance == null) {uniqueInstance = new Singleton();}return uniqueInstance;}}
如果要处理多线程怎么办? 、加入synchronized关键字
public class Singleton {private static Singleton uniqueInstance;private Singleton() {}public static synchronized Singleton getInstance() {if (uniqueInstance == null) {uniqueInstance = new Singleton();}return uniqueInstance;}}
我们想一下,这样子会有什么问题:
- 每次获取这个实例都需要同步
- 其实在uniqueInstance初始化后,就不需要同步了
改进一下:
第一种(静态初始化):
public class Singleton {private static Singleton uniqueInstance = new Singleton();private Singleton() {}public static synchronized Singleton getInstance() {return uniqueInstance;}}
第二种(双重检查加锁):
public class Singleton {private volatile static Singleton uniqueInstance = new Singleton();private Singleton() {}public static synchronized Singleton getInstance() {if (uniqueInstance == null) {synchronized (Singleton.class) {if (uniqueInstance == null) {uniqueInstance = new Singleton();}}}return uniqueInstance;}}
注意:volatile关键字的作用
