volatile与synchronized详解
2018-11-09 本文已影响0人
和帅_db6a
volatile具有两个特性,一个是保证此变量对所有线程的可见性,另一个是禁止指令重排序。volatile变量的运算在并发情况下也是不安全的。如下

最后输出结果都不一样,都是一个小于200000的数字。原因在于java里面的运算并非原子操作。所以在以下两种情况下我们仍然需要加群(synchronized或concurrent中的原子类)来保证原子性1.运算结果并不依赖变量的当前值,或者能够确保只有一个单一线程修改变量的值2.变量不需要与其他的状态变量共同参与不变约束。

synchronized是保证一个变量在同一时刻只允许一条线程对其进行lock操作来保证同步的。它提供了更高层次的字节码指令monitorenter和monitorexit来隐式地加锁,因此代码块之间的操作也具备原子性。