当前位置: 代码迷 >> 综合 >> volatile-禁止重排序在单例中应用
  详细解决方案

volatile-禁止重排序在单例中应用

热度:56   发布时间:2023-11-20 04:55:38.0

volatile功能介绍

  1. 保证可见性
  2. 不保证原子性
  3. 禁止重排序

常见的懒汉式的代码到底有什么问题?

public class SingletonModel {
    private static SingletonModel  instance = null;private SingletonModel(){
    }public static SingletonModel getInstance() {
    if(instance == null) {
    synchronized(SingletonModel.class) {
    if(instance == null) {
      // 1instance = new SingletonModel(); /// ***}}}return instance;}
}

主要是在我标记星号的位置,在这一行赋值语句的代码,其实包含三个代码指令
1.分配内存空间
2.初始化内存空间
3.赋值操作

第2步和第3步可能会进行重排序,instance已经返回,但是此时instance并没有赋值,如果其他线程获得锁碰巧在运行到1,判断为null,创建第二个对象,加了volatile就可以禁止第2和第3步重排序

欢迎各位小伙伴评论交流

  相关解决方案