假设我们使用双重检查锁来实现单例模式:
private static Singleton instance; private static Object lock = new Object(); public static Singleton getInstance() { if(instance == null) { synchronized (lock) { if(instance == null) { instance = new Singleton(); } } } return instance; }
我们需要将变量“ instance”设置为“ volitile”吗?我听到一句话说我们需要它来禁用重新排序:
创建对象时,可能会发生重新排序:
address=alloc instance=someAddress init(someAddress)
他们说,如果对最后两个步骤进行了重新排序,我们需要一个经过训练的实例来禁用重新排序,否则其他线程可能会得到未完全初始化的对象。
但是由于我们处于同步代码块中,我们真的需要挥发吗?还是一般来说,我是否可以说同步块可以保证共享变量对其他线程是透明的,即使它不是volatile变量也不会重新排序?
假设我们使用双重检查锁来实现单例模式:私有静态单例实例;私有静态对象锁= new Object();公共静态单例getInstance(){...
在进行这种解释之前,您需要了解编译器所做的一种优化(我的解释非常简化)。假设在代码的某个地方有这样一个序列: