双重检查锁,synchronized,volatile

以前看java并发编程实践的时候,大致看了下,说双重检查加锁有问题,也没有细看原因。看到邮件列表里面有这个东西,觉得synchronized会更好, 回去把书又翻了下,其实因为变量使用了volatile,已经把原来的缺陷避免了, 如果不使用volatile的话,有可能第一个线程A调用了构造函数,abc已经不为null了,但是对另一个线程可能是不可见的,看到还是abc还是null,于是就进到里面去了,就有可能导致构造了两个出来, 使用了volatile之后,第一个线程的更改对其他线程是立即可见的。也就避免了上述问题。
public class WanLiang extends AliPeople{

    private String name = "test";
    private volatile static WanLiang abc;

    private WanLiang() {}
    public static WanLiang getInstance() {
        if (abc == null) {
            //双重检查加锁
            synchronized (WanLiang.class) {
                if (abc == null) {
                    abc = new WanLiang();
                }
            }
        }
        return wanLiang;
    }
后记:去翻了下书,发现还有好多书要去看,好多知识去补。。。。从今天起,停止微博,人人一个月

Published: August 03 2012