所有变量的简单赋值写操作,java语言规范原生给你保证原子性的;32位java虚拟机里的long/double是不保证赋值写的原子性的;volatile可以解决这个问题;不保证原子性的一些操作呢?
i++
i = y + 1
i = x * y ==> 先把x和y分别从主内存里加载到工作内存里面来,然后再从工作内存里加载出来执行计算(处理器),计算后的结果写回到工作内存里去,最后还要从工作内存里把i的最新的值刷回主内存
CAS,AtomicInteger => compareAndSet
你敢说他是原子的?
volatile x = 1;
volatile y = 2;
volatile i = x * y;
我之前给大家已经说过了,画图都演示过了
FSDirectory dir = ...
synchronized(dir) {
dir.add();
dir.remove();
dir.insert();
}
加锁