接下来几天,我会写写关于多线程方面的博客,今天的主题是volatile关键字。
-
首先,先写一下Java内存模型的相关知识。
-
JMM一般都是围绕原子、可见、有序性三点讨论,在此仅是简单介绍。
-
工作内存与主存定义:JVM定义了规定了所有变量都是存在主存里,每个线程都有自己的工作内存,线程对变量的所有操作都必须在其工作内存上进行,而不是直接对主存进行操作,而且每个线程都不能访问其它线程的工作内存。
-
从图中,可知道高并发环境下,线程并不是直接去修改内存中的值,而是先去修改本身持有的副本。
-
-
浅谈,volatile是什么?
- 为什么要用volatile?原因是在JMM中为了在适当的场合,确保线程间的有序性和可见性,java使用了一些特殊操作或者关键字来申明告诉虚拟机这个地方需要特别注意,不能随便变动优化目标指令。关键字volatile便是其中之一。
- 当使用voaltile去修改一个变量的时候,就等于告诉虚拟机,这个变量是不稳定的,极有可能被某段程序或其他线程修改,为了确保这个变量在被修改后,让该应用程序中的所有线程能及时"看见",那么虚拟机就需要采取一些特殊手段保证该变量的可见性。
- 保证可见性的简略过程,类似MESI协议:
- 预设两个线程,名称分别为A和B。使用volatile关键字修饰的