volatile功能介绍
- 保证可见性
- 不保证原子性
- 禁止重排序
常见的懒汉式的代码到底有什么问题?
public class SingletonModel {
private static SingletonModel instance = null;
private SingletonModel(){
}
public static SingletonModel getInstance() {
if(instance == null) {
synchronized(SingletonModel.class) {
if(instance == null) { // 1
instance = new SingletonModel(); /// ***
}
}
}
return instance;
}
}
主要是在我标记星号的位置,在这一行赋值语句的代码,其实包含三个代码指令
1.分配内存空间
2.初始化内存空间
3.赋值操作
第2步和第3步可能会进行重排序,instance已经返回,但是此时instance并没有赋值,如果其他线程获得锁碰巧在运行到1,判断为null,创建第二个对象,加了volatile就可以禁止第2和第3步重排序
欢迎各位小伙伴评论交流