场景引入,问题初现
很多同学出去面试,都会被问到一个常见的问题:说说你对volatile的理解?
不少初出茅庐的同学可能会有点措手不及,因为可能就是之前没关注过这个。但是网上百度一下呢,不少文章写的很好,但是理论扎的太深,文字太多,图太少,让人有点难以理解。
基于上述痛点,这篇文章尝试站在年轻同学的角度,用最简单的大白话,加上多张图给大家说一下,volatile到底是什么?
当然本文不会把理论扎的太深,因为一下子扎深了文字太多,很多同学还是会不好理解。
本文仅仅是定位在用大白话的语言将volatile这个东西解释清楚,而涉及到特别底层的一些原理和技术问题,以后有机会开文再写。
首先,给大家上一张图,咱们来一起看看:

如上图,这张图说的是java内存模型中,每个线程有自己的工作内存,同时还有一个共享的主内存。
举个例子,比如说有两个线程,他们的代码里都需要读取data这个变量的值,那么他们都会从主内存里加载data变量的值到自己的工作内存,然后才可以使用那个值。
好了,现在大家从图里看到,每个线程都把data这个变量的副本加载到了自己的工作内存里了,所以每个线程都可以读到data = 0这个值。
这样,在线程代码运行的过程中,对data的值都可以直接从工作内存里加载了,不需要再从主内存里加载了。
那问题来了,为啥一定要让每个线程用一个工作内存来存放变量的副本以供读取呢?我直接让线程每次都从主内存加载变量的值不行吗?
很简单!因为线程运行的代码对应的是一些指令,是由CPU执行的!但是CPU每次执行指令运算的时候,也就是执行我们写的那一大坨代码的时候,要是每次需要一个变量的值,都从主内存加载,性能会比较差!
所以说后来想了一个办法,就是线程有工作内存的概念,类似于一个高速的本地缓存。
这样一来,线程的代码

本文通过大白话解释Java并发编程中的可见性问题,介绍volatile关键字的作用。volatile确保当一个线程修改了共享变量的值,其他线程能立即看到更新,但不保证原子性。通过强制刷新工作内存和使其他线程缓存失效来实现可见性。
最低0.47元/天 解锁文章
513

被折叠的 条评论
为什么被折叠?



