volatile 在多线程开发中是可以经常看到的变量修饰符,本文主要是比较浅显的介绍 volatile 的作用。
在开始之前多线程并发编码往往需要考虑这几个方面:
原子性:一段代码,按顺序完整执行,执行过程中不能插入其他的操作。
可见性:一个线程修改了共享变量或者副本变量其他有关的线程能立即获得反馈。
顺序性:程序执行的顺序按照代码的先后顺序执行。
volatile 修饰符是用来提高可见性和顺序性的。
volatile 修饰符不保证原子性。
可见性:Java内存模型
JVM 在启动一个新的线程时,即调用 Thread.start()会为此线程开辟一个工作空间(虚拟机栈),这个内存空间会复制Thread 对象的属性到该工作空间中,在这里会进行值 Copy 的是基本类型如 boolean、int等,对象也会进行复制,但对象仅仅会复制引用不会复制实例。
这个模型就会有一个问题,线程A和线程B都是在读自己的副本变量,如果另外一个线程修改了共享变量 A,对于线程 A和线程 B都是没有感知的。
Was this helpful?
0 / 0