关于Java的volatile

Posted beheaven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java的volatile相关的知识,希望对你有一定的参考价值。

volatile的作用

1.防止指令重排序

   首先要理解什么是指令重排序?指令重排序的利弊?后续举例说明

2.多线程访问共享资源时,缓解synchronized重量级锁带来的性能问题

但是volatile在特定的场景下使用,才能发挥其作用。如果对其原理理解不透彻,使用不当,会带来很多问题。

volatile使用注意几点:

1.能够保证并发线程访问共享变量(资源)的可见性,但不能保证其安全性

2.当并发线程访问(例如修改)的共享变量结果值不依赖当前值。

   例如:多个线程访问共享变量count,执行count++,肯定不行,每个线程当前修改的count变量结果依赖于其之前的值。

又例如:两个并发线程A和B,A的作用是满足某一条件时终止线程B,当然终止B线程的时候,是通过共享变量flag的值进行,该变量类型为boolean。

A、B两个线程开始运行时,flag的默认值为false.当A线程发现满足终止条件时,立即将flag设置为true,此时线程B发现flag变量值为true,线程任务执行完毕。仔细思考这种场景下,

A线程设置flag的值时,不会受flag之前值的影响(不管flag之前是false还是true),只要A线程发现满足终止条件,立即将flag设置为true.这种场景就是两个线程通过flag进行通信,每个线程修改flag值又不依赖之前的值,可以大胆使用volatile修饰flag.

 

以上是关于关于Java的volatile的主要内容,如果未能解决你的问题,请参考以下文章

Java线程安全 关于原子性与volatile的试验

关于 Java 关键字 volatile 的总结

关于JAVA 中volatile使用的一些笔记

关于JAVA中的JMM内存模型

关于JAVA中的JMM内存模型

Java并发编程-volatile可见性的介绍