单例模式的学习

单例模式

  • 类构造器私有
  • 持有自己类型的属性
  • 对外提供获取实例的静态方法

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

单例模式又分为多种方式

推荐使用的是双重锁模式,性能高,具体其他模式可见链接: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实例变量有效,解决该问题。
原文地址:https://www.cnblogs.com/cherishforchen/p/11627402.html