双重检查锁,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;
}
后记:去翻了下书,发现还有好多书要去看,好多知识去补。。。。从今天起,停止微博,人人一个月