为什么使用volatile比同步代价更低?
同步的代价主要由其覆盖范围决定如果可以降低同步的覆盖范围则可以大幅提升程序性能
而volatile的覆盖范围仅仅变量级别的因此它的同步代价很低
volatile原理是什么?
volatile的语义其实是告诉处理器不要将我放入工作内存请直接在主存操作我(工作内存详见java内存模型)
因此当多核或多线程在访问该变量时都将直接操作主存这从本质上做到了变量共享
volatile的有什么优势?
更大的程序吞吐量
更少的代码实现多线程
程序的伸缩性较好
比较好理解无需太高的学习成本
volatile有什么劣势?
容易出问题
比较难设计
volatile运算存在髒数据问题
volatile仅仅能保证变量可见性无法保证原子性
volatile的race condition示例
public class TestRaceCondition {
private volatile int i = ;
public void increase() {
i++;
}
public int getValue() {
return i;
}
}
多线程执行increase方法时是否能保证它的值会是线性递增的呢?
答案是否定的
[] [] [] []