请复制后面的链接在新的网页端打开,直接没法链接到,不过 文章非常详细 ,希望耐心阅读:
Java并发编程:volatile关键字解析 - Matrix海子 - 博客园
1、Java 中能创建 volatile 数组吗?
能。Java中可以创建volatile类型数组,只不过是一个指向数组的引用,而不是整个数组。
如果改变引用指向的数组,将会受到volatile的保护,但是如果多个线程同时改变数组元素,
volatile标识符就不会起到保护作用了。
2、volatile 能使得一个非原子操作变成原子操作吗?
Java中该成员变量会被多个线程操时,最好将其设置为volatile。
例如Java中long类型变量不是原子的,需要分成两步,如果一个线程在修改long变量的值,
另一个线程只能看到该值的一半(前32位)。
所以,对于一个volatile修饰的double和long类型的变量,读写就是原子的。
3、volatile 类型变量提供什么保证?
volatile可以保证:
1、共享数据操作可见性
2、有序性
3、禁止指令重新排序
4、happens-before保证(确保一个线程修改,对其他线程可见)
【不一定能保证原子性,但是Java中volatile修饰double和long类型数据,就保证了读写的原子性】