@hainingwyx
2017-07-28T16:05:38.000000Z
字数 509
阅读 1395
Java
- 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了
错。volatile能保证可见性,不能保证复合操作的原子性。基本数据类型的读取和赋值具有原子性。
因此volatile能保证基本数据类型的读取和赋值是线程安全的。对应i++操作,实际上包括了读取和赋值两个操作,volatile不能保证原子性,因此不是线程安全的。
volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存。这样任何时刻,不同的线程总能看到该变量的最新值。
线程写volatile变量的过程
1). 改变线程工作内存中volatile变量副本的值
2).将改变后的副本的值从工作内存刷新到主内存
线程读volatile变量的过程
1).从主内存中读取volatile变量的最新值到线程的工作内存中
2).从工作内存中读取volatile变量的副本
private int number = 0;
number++; //不是原子操作
它分为三步:读取number的值;将number的值加1;写入最新的number的值