解读volatile

1.volatile初认识

Volatile 具有可见性和原子性。可见性对于一个volatile变量的读,总是能看到对这个变量最后的写入,原子性对任意单个变量的读写具有原子性,到类似++这种复合操作不具有原子性。

volatile写读建立在happens-before关系上,可以实现线程之间通信。volatile的写-读与锁的释放-获取相同,volatile写与锁的释放对应,读与锁的获取对应。

volatile写时,java并发控制会把该线程对应的本地内存中的变量刷新到主内存中。写线程向其它读线程发送消息。

volatile读时,java内存模型JMM会把本地内存设置为无效,并把主内存的数据读取到本地共享变量中。读线程接受写线程发送的消息。

写线程通过主内存向读线程发送消息实现线程之间通信。

2.volatile内存语义实现

重排序是为了提高性能,编译器和处理器会对相应的指令做重排序。分为编译器优化重排序,指令级并行重排序,内存系统重排序。

当第二个操作是volatile写时,不管前面是什么操作都不能重排序,这个规则确保了volatile写之前的操作都不能被编译器重排序到volatile写之后。

当第一个操作为volatile读时,不管后面是操作都不能重排序。这个规则确保volatile读之后的操作不会被编译器优化重排序到volatile读之前。

当一个操作为写时,第二个为读不能重排序。

编译器采用内存屏障来禁止重排序。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容