volatile关键字
1、当一个变量被定义为volatile时,这个变量对所有线程是可见的,就是说当一个线程修改了这个变量时,其他线程读取到的永远是修改后的最新的值。
但不能因为这样就说基于volatile变量的运算在并发下是安全的,比如多个线程对一个数据进行++操作时:当前线程读取到的是最新的值,但是在它对数据进行++时,别的线程可能也对此时的数据进行了++操作,这就导致当前线程的++操作是无效的。
2、volatile关键字还能禁止指令重排序列化。
例如:指令1把A的值加10,指令2把A的值乘2,指令3把B的值加1。因为指令1和2有依赖关系,所以他们不会重排序,但指令3在执行的时候可能排到1之前或者1和2的中间。
3、使用volatile关键字要比其他同步工具更快。
volatile进行读操作时性能消耗跟普通变量几乎没有什么差距,但是写操作可能会慢一些,因为它需要在本地代码中插入内存屏障指令来禁止重排序。即便如此,它的性能消耗大多数情况下也要比锁低
使用volatile关键字需要满足的条件:
1、写入变量时并不依赖变量的当前值,或者能确保只有单一线程修改变量的值
2、变量不需要与其他状态变量共同参与不变约束
3、访问变量时,没有其他原因需要加锁