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.