失效链接处理 |
volatile相关理论知识 PDF 下载
本站整理下载:
相关截图:
主要内容:
初步认识 Volatile
一段代码引发的思考
下面这段代码,演示了一个使用 volatile 以及没使用
volatile 这个关键字,对于变量更新的影响
public class VolatileDemo {
public /*volatile*/ static boolean stop=false;
public static void main(String[] args) throws
InterruptedException {
Thread thread=new Thread(()->{
int i=0;
while(!stop){
i++;
}
});
thread.start();
System.out.println("begin start thread");
Thread.sleep(1000);
stop=true;
} }
volatile 的作用
volatile 可以使得在多处理器环境下保证了共享变量的可
见性,那么到底什么是可见性呢?不知道大家有没有思考
过这个问题
在单线程的环境下,如果向一个变量先写入一个值,然后
在没有写干涉的情况下读取这个变量的值,那这个时候读
取到的这个变量的值应该是之前写入的那个值。这本来是
一个很正常的事情。但是在多线程环境下,读和写发生在
不同的线程中的时候,可能会出现:读线程不能及时的读
取到其他线程写入的最新的值。这就是所谓的可见性
为了实现跨线程写入的内存可见性,必须使用到一些机制
来实现。而 volatile 就是这样一种机制
volatile 关键字是如何保证可见性的?
我们可以使用【hsdis】这个工具,来查看前面演示的这段
代码的汇编指令,具体的使用请查看使用说明文档
在运行的代码中,设置 jvm 参数如下
【-server -Xcomp -XX:+UnlockDiagnosticVMOptions -
XX:+PrintAssembly -
XX:CompileCommand=compileonly,*App.*(替换成实际
运行的代码)】
然后在输出的结果中,查找下 lock 指令,会发现,在修改
带有 volatile 修饰的成员变量时,会多一个 lock 指令。lock
是一种控制指令,在多处理器环境下,lock 汇编指令可以
基于总线锁或者缓存锁的机制来达到可见性的一个效果。
为了让大家更好的理解可见性的本质,我们需要从硬件层
面进行梳理
|