JVM运行时刻内存的分派详解
在 java 垃圾接纳整理一文中,描写了jvm运行时刻内存的分派。个中有一个内存区域是jvm虚拟机栈,每一个线程运行时都有一个线程栈,
线程栈生存了线程运行时候变量值信息。当线程会见某一个工具时候值的时候,首先通过工具的引用找到对应在堆内存的变量的值,然后把堆内存
变量的详细值load到线程当地内存中,成立一个变量副本,之后线程就不再和工具在堆内存变量值有任何关系,而是直接修改副本变量的值,
在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到工具在堆中变量。这样在堆中的工具的值就发生变革了。下面一幅图
描写这写交互
ead and load 从主存复制变量到当前事情内存
use and assign 执行代码,改变共享变量值
store and write 用事情内存数据刷新主存相关内容
个中use and assign 可以多次呈现
可是这一些操纵并不是原子性,也就是 在read load之后,假如主内存count变量产生修改之后,线程事情内存中的值由于已经加载,不会发生对应的变革,所以计较出来的功效会和预期纷歧样
对付volatile修饰的变量,jvm虚拟机只是担保从主内存加载到线程事情内存的值是最新的
譬喻如果线程1,线程2 在举办read,load 操纵中,发明主内存中count的值都是5,那么城市加载这个最新的值
在线程1堆count举办修改之后,会write到主内存中,主内存中的count变量就会变为6
线程2由于已经举办read,load操纵,在举办运算之后,也会更新主内存count的变量值为6
导致两个线程实时用volatile要害字修改之后,照旧会存在并发的环境。