因为懒汉式的实现是线程安全的,所以会降低整个访问速度,而且每次访问都要判断一次。有没有更好的方式实现呢?可以使用“双重检查枷锁”的方式来实现。
所谓“双重检查加锁”机制,是指并不是每次静茹getInstance方法都需要同步,而是先不同步。当进入方法后,先检查实力是否存在,如果不存在才进行下面的同步块,着是第一次检查,进入同步代码块,再次检查实力是否存在。如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,整个过程只需要一次同步,从而减少了多次在同步情况下进行判断所浪费的时间。
public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { // 先检查实例是否存在,如果不存在才进入下面的同步块 if(instance == null) { // 同步块,线程安全的创建实例 synchronized (Singleton.class) { // 再次检查实例是否存在,如果不存在,才真正地创建实例 if (instance == null) { instance = new Singleton(); } } } return instance; } }