在java的世界中存在的各种各样的关键字,就像其他的语言一样,这些关键字组成了这个丰富的java的世界。有很多关键字大家是比较的熟悉的,但是还有一些关键字,连作者自己都没有遇到过或者是遇到过也没有使用过。今天我们就来聊聊”volatile”.
java开发中有内存这个概念,我想大家没有不知道的吧,代码在虚拟机中执行是需要将code读到内存中的。
一个人的世界
如果这块儿内存空间是单个“人”用那还好办,很简单。我这里就假设内存就是一个房子,线程呢,就是人。当一个人的时候,我想在房子里做一些事情的时候,我只需要进房间,锁门,做事情,然后结束,离开房子,这中间的某一个环节,这个人会把自己的劳动成果上交给“仓库”验收。
两个或者多个人的世界
多个人自然会有多个房子,每个人进入自己的房子做事的流程跟上面的是一样的。但是,假如,王某做的事情和李某有交集,问题就来了。他们每个人其实都不是很熟悉,也不想打招呼的,也可以说是“老死不相往来”。所以,王某干脆就直接从“仓库”那里的李某的资源里找寻自己所需的资源。王某很厉害,一下子就找到了资源。王某兴高采烈地完成了自己工作,上报给了“仓库”,然后离开了屋子。但是,这个过程没有问题吗?你们觉得一定没有问题吗?肯定是有的,那就是王某从“仓库”里获取李某资源的时候,很有可能拿到的是王某之前的资源,并不是李某最新的资源,那么,这样王某用了李某过期的资源完成任务还能是正确的任务结果吗?自然是不正确的。因为王某对李某什么时候做完,什么时候更新“仓库”里的资源并不清楚,而且王某还不想开口问李某。这就难办了,这个问题在Java的世界里,被称为“内存可见性”。
内存可见性的问题
上文说了,王某由于无法知道李某更新资源的时机,因此会有可能导致问题的发生。那么应该如何解决呢?volatile!呼叫他就可以让问题迎刃而解,他的作用就像是一个监督员,每当王某要去拿李某的资源使用的时候,这个监督员就强制通知李某,你该更新你的“仓库”资源了哈,有人要用你的资源做点什么了!李某只能乖乖地照办,也不管谁要用他的资源,这样王某就成功且正确的拿到了李某正确的资源,顺利地完成了任务。