单例模式
- 类构造器私有
- 持有自己类型的属性
- 对外提供获取实例的静态方法
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
单例模式又分为多种方式
推荐使用的是双重锁模式,性能高,具体其他模式可见链接:https://www.jianshu.com/p/3bfd916f2bb2
public class Singleton { private volatile static Singleton singleton;
或者
private volatile static Singleton singleton=null;
//让构造函数为 private,这样该类就不会被实例化
private Singleton (){}
//获取唯一可用的对象
public static Singleton getSingleton() {
if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
双重检查模式,进行了两次的判断,第一次是为了避免不要的实例,第二次是为了进行同步,避免多线程问题。由于
singleton=new Singleton()
对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile
修饰signleton
实例变量有效,解决该问题。