——————————————————————————————————
数据依赖不能进行重排序

class ReorderExample { int a = 0; boolean flag = false; public void writer() { a = 1; // 1 flag = true; // 2 }Public void reader() { if (f?lag) { // 3 int i = a * a; // 4 …… } }
}
可能出现,2->3->4->1这样的执行顺序,导致结果i=0;
通过加锁实现顺序一致性,加锁后里面重排序也没有问题,因为上锁之后,切换线程后t1没有释放锁,t2无法拷贝,时间片过了之后就会切换成t1执行,t1整个方法执行完之后才会释放锁,肯定能保证t1的结果正确。
总线事务包括读事务和写事务(事务:一系列的操作要么都成功,要么都失败-ACID)
在一个处理器执行总线事务期间,总线会禁止其他的处理器和I/O设备执行内存的读/写
当单个内存操作不具有原子性时,可能会产生意想不到后果:
双重检查锁定:人们想通过双重检查锁定来降低同步的开销。下面是使用双重检查锁定来实现延迟初始化的示例代码。

构造方法还是有问题的,还有重排序问题
现在不锁方法了,证明方法可以被很多线程拷贝
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
}

上一篇:长安汽车:接受招商资管等机构调研