在大量Java设计模式中,单例模式是常见的构建模式之一,其实现方式也可以根据某些特性产生多个变形。
下面介绍在Java 1.5中,结合使用volatile与synchronized,通过双校验锁机制实现的单例模式,实现代码如下:
public class MyDoubleCheckedSingleton {
private volatile static MyDoubleCheckedSingleton singleton;
private MyDoubleCheckedSingleton() {
}
public static MyDoubleCheckedSingleton getSingleton() {
if (singleton == null) {
synchronized (MyDoubleCheckedSingleton.class) {
if (singleton == null) {
singleton = new MyDoubleCheckedSingleton();
}
}
}
return singleton;
}
}
说明:
1.实例变量singleton使用volatile,是借助于Java 1.5提供的对实例变量的读写原子特性,这样对singleton变量的设置不会被中断(例如实例化过程未完成即被中断),并且设置的实例立刻被所有线程可见。
2.对于getSingleton()方法,为了尽量减少临界区,所以首先读取singleton变量判断是否为null,然后再加类锁进行后续的更新操作。这属于典型的“read-update-write"操作,只适用volatile不能保证并发的安全,所以需要使用synchronized加锁。
参考文献:
https://www.cs.umd.edu/users/pugh/java/memoryModel/jsr-133-faq.html#volatile