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

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;
}
}
