这里解释一下,volatile 的作用确实不是禁止指令重排序(虽然网上大都是这么笼统的说的) 之所以多线程会获取到未完全初始化完成的单例对象,是因为new关键字在字节码中是分三步来执行的,正是这三步的乱序造成了线程不安全的问题。volatile真正的作用是在这三步字节码前后加上内存屏障(而不是禁止重排),从而防止对象在未初始化完成就被获取
13 10

相关推荐

牛客网
牛客企业服务