synchronized是否限制内部代码的重排序
synchronized所修饰的内部代码是否会重排序
synchronized所修饰的内部代码是否会重排序
2019-04-08
补充一个问题
之前工作的时候写单例模式,举例如下,主管非得让加volatile来修饰single,说如果不加会有重排序问题,从而导致空指针,但是看到大家的讨论和老师的回答,我觉得不需要加volatile,因为synchronized关键字已经保证了只会有一个线程进入创建单例对象的代码,当这个线程锁释放的时候,因为happens-before原则,其他线程拿到的单例一定是完整的,也就是说这个单例的属性一定是已经被赋值的,不会出现空指针问题,请问老师我的理解准确吗
public class ExampleSingle { private volatile static ExampleSingle single; ***一些属性 private ExampleSingle() { *** 假如这里对这些属性进行了赋值操作 } public static ExampleSingle getInstance() { if (single == null) { synchronized (ExampleSingle.class) { if (single == null) { single = new ExampleSingle(); } } } return single; } }
举报