[关闭]
@hainingwyx 2017-07-28T08:05:38.000000Z 字数 509 阅读 1290

Java笔试易错题

Java


  1. 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

错。volatile能保证可见性,不能保证复合操作的原子性。基本数据类型的读取和赋值具有原子性。
因此volatile能保证基本数据类型的读取和赋值是线程安全的。对应i++操作,实际上包括了读取和赋值两个操作,volatile不能保证原子性,因此不是线程安全的。

volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而当该变量发生变化时,又会强迫线程将最新的值刷新到主内存。这样任何时刻,不同的线程总能看到该变量的最新值。

线程写volatile变量的过程

1). 改变线程工作内存中volatile变量副本的值
2).将改变后的副本的值从工作内存刷新到主内存

线程读volatile变量的过程

1).从主内存中读取volatile变量的最新值到线程的工作内存中
2).从工作内存中读取volatile变量的副本

  1. private int number = 0;
  2. number++; //不是原子操作

它分为三步:读取number的值;将number的值加1;写入最新的number的值

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注