缘由
今天被问到一个问题,太久没看了,记混了,特此记录一下。
线程安全三大特性
总所众知,多线程安全主要变现为三个特性:可见性、原子性、有序性。
Volatile
而说到可见性,就不得吧提到Volatile这个关键词。
对于大部分基础数据类型,单独的读写操作都是具有原子性的,Volatile保证了其可见性。
但是double、long这两种类型的读写则有所不同。
double、long本身有64位宽,对于Java虚拟机,目前是将32位的读写作为原子操作,所以double和long的读写需要分为两次,每次读写32位。
如果不进行数据安全相关处理,则会出现问题:
通常来说,Volatile这个关键字的作用仅保证数据的可见性,并不保证原子性,而对于double和long的读写,Volatile还额外保证了读写的原子性。
注意:Volatile对于double、long的读写原子性仅指单次读或单次写,如果一个操作同时具有读写,则不能保证整体的原子性,如i++;