场景引入,问题初现
很多同学出去面试,都会被问到一个常见的问题:说说你对volatile的理解?
不少初出茅庐的同学可能会有点措手不及,因为可能就是之前没关注过这个。但是网上百度一下呢,不少文章写的很好,但是理论扎的太深,文字太多,图太少,让人有点难以理解。
基于上述痛点,这篇文章尝试站在年轻同学的角度,用最简单的大白话,加上多张图给大家说一下,volatile到底是什么?
当然本文不会把理论扎的太深,因为一下子扎深了文字太多,很多同学还是会不好理解。
本文仅仅是定位在用大白话的语言将volatile这个东西解释清楚,而涉及到特别底层的一些原理和技术问题,以后有机会开文再写。
首先,给大家上一张图,咱们来一起看看:
如上图,这张图说的是java内存模型中,每个线程有自己的工作内存,同时还有一个共享的主内存。
举个例子,比如说有两个线程,他们的代码里都需要读取data这个变量的值,那么他们都会从主内存里加载data变量的值到自己的工作内存,然后才可以使用那个值。
好了,现在大家从图里看到,每个线程都把data这个变量的副本加载到了自己的工作内存里了,所以每个线程都可以读到data = 0这个值。
这样,在线程代码运行的过程中,对data的值都可以直接从工作内存里加载了,