《大话设计模式》读书笔记:单例模式与Java同步锁synchronized
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。在单例模式下,类本身负责保存它的唯一实例,这个类必须保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。单例模式的类中,构造方法(函数/体)被设为private,从而堵死了外部实例化该类的可能。同时,在类中提供一个静态方法负责提供该类的唯一实例,并在实例不存在的情况下试图初始化它。
下面的示例展示了单例模式的典型实现:
public class Singleton { private static Singleton instance; private final static Object syncLock = new Object(); private Singleton() { } public static Singleton getInstance(){ if (instance == null) { synchronized (syncLock) { if (instance == null) { instance = new Singleton(); } } } return instance; }}
需要注意的是,synchronized同步块处括号中的锁定对象采用的是一个无关的Object类实例。将它作为锁而不是通常synchronized所用的this,其原因是getInstance方法是一个静态方法,在它的内部不能使用未静态的或者未实例化的类对象(避免空指针异常)。同时也没有直接使用instance作为锁定的对象,是因为加锁之时,instance可能还没实例化(同样是为了避免空指针异常)。
此外,单例类中不建议将getInstance方法修饰为synchronized方法,其原因是一旦这样做了,其效果就跟《大话设计模式》书中21.5小节的示例是一样的了。这种做法会在每次调用getInstance方法时,都需要加锁,与上例相比效率更低。