网站开发无形资产,视频广告制作,德清淘宝网站建设,小众软件wordpress主题JMM 简单理解
1 Java 内存模型 Java 内存模型#xff08;Java Memory Model#xff0c;JMM#xff09;#xff0c;主要为了屏蔽各种硬件和操作系统的内存差异#xff0c;以实现让 Java 程序在各种平台下都能达到一致的内存访问效果#xff0c;而设计的
2 工作内存与主内…JMM 简单理解
1 Java 内存模型 Java 内存模型Java Memory ModelJMM主要为了屏蔽各种硬件和操作系统的内存差异以实现让 Java 程序在各种平台下都能达到一致的内存访问效果而设计的
2 工作内存与主内存 JMM 包括两大区域工作内存和主内存。下图表示线程、工作内存、主内存三者的交互关系 线程对应的的工作内存保存该线程所使用的主内存变量的副本线程对变量的所有操作读取赋值等都必须在工作内存中进行而不能直接读写主内存中的数据不同线程也无法访问对方工作内存中的变量
3 内存间的交互操作
lock锁定作用于主内存的变量它把一个变量标识为一条线程独占的状态unlock解锁作用于主内存的变量它把一个处于锁定状态的变量释放出来释放后的变量才可以被其他线程锁定read读取作用于主内存的变量它把一个变量的值从主内存传输到线程的工作内存中以便随后的 load 动作使用load载入作用于工作内存的变量它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中use使用作用于工作内存的变量它把工作内存中一个变量的值传递给执行引擎每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作assign赋值作用于工作内存的变量它把一个从执行引擎接收的值赋给工作内存的变量 每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作store存储作用于工作内存的变量它把工作内存中一个变量的值传送到主内存中以便随后的 write 操作使用write写入作用于主内存的变量它把 store 操作从工作内存中得到的变量的值放入主内存的变量中
4 经典代码案例
package com.fzshuai.volatile1;import java.util.concurrent.TimeUnit;/*** author fzshuai* date 2023/10/26 23:32* since 1.0*/
public class JMMDemo {private static int num 0;public static void main(String[] args) {new Thread(() - {while (num 0) {}}).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {throw new RuntimeException(e);}num 1;System.out.println(num);}
} 为什么程序一直在执行没有停止呢让我们来看看线程与内存之间的交互不难发现线程 B 改变了变量 num 的值但是线程 A 并不知道 5 资源的可见性