单例模式

JAVA学习网 2020-10-09 23:12:02

为什么要使用单例模式?

一些对象只需要一个,比方说:threadPool,cache,对话框,处理偏好设置和registry的对象,使用单例模式能够再真正需要该对象的时候再创建,避免浪费资源。

经典单例模式

 

public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {}
    public static Singleton getInstance() {
        if(Objects.isNull(uniqueInstance)) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

 

缺点:

  多线程造成多个实例的风险。

解决方案1:

public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
if(Objects.isNull(uniqueInstance)) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
  }
 }

缺点:

  直接同步会使得线程每次都会被阻拦再该方法外,即使该对象已被实例化。

解决方案2:

public class Singleton {
    private static volatile Singleton uniqueInstance;
    private Singleton() {}
   public static synchronized Singleton getInstance() {
     // 检查实例,如果不存在,就进入同步区块
        if(Objects.isNull(uniqueInstance)) {
       synchronized(Singleton.class) {
         // 进入区块后,再检查一次
         if(uniqueInstance == null) {     uniqueInstance
= new Singleton();
         }
       } }
return uniqueInstance; }
}

这种方法能够解决多线程的问题又能兼顾性能

解决方案3:

public class Singleton {
    private static  Singleton uniqueInstance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return uniqueInstance;
    }
}

静态变量直接初始化,适合那些初始化不怎么耗费资源的对象。

阅读(2387) 评论(0)