JVM (三)--内存模型、变量可见性、指令重排、内存屏障

本文详细介绍了Java内存模型(JMM),解释了主内存和工作内存的区别,通过实例展示了变量可见性和指令重排的问题。volatile关键字在此中起到了保证变量可见性的作用,但无法确保原子性。同时,文章还阐述了内存屏障的概念及其四种类型,以及volatile如何通过内存屏障防止指令重排,以确保多线程环境下的正确性。
摘要由CSDN通过智能技术生成

Java内存模型

Java内存模型(JMM):Java定义的一中抽象规范,用来屏蔽不同硬件和操作系统的内存访问差异,让Java程序在不同平台下都能达到一致的内存访问效果。

Java内存图示:

1、主内存:线程共享内存,线程读写访问较慢;

包括方法区和Java堆,对于一个共享变量(比如静态变量,堆内存中的实例),主内存存有其“本尊”。

2、工作内存:线程私有的内存,线程访问较快。

对于主内存中的某个变量,使用它的线程的内存空间保存了它的一个”副本”。

线程对共享变量的所有操作都必须在其工作内存中进行,不能直接读写主内存中的变量。

不同线程之间也无法访问彼此的工作内存,变量值在线程之间的传递只能通过主内存来传递。

举个例子:

对于一个静态变量    static int s = 0;

线程A执行代码         s = 3;

那么,JMM的工作流程如下图所示:

 

 

在上面过程中,线程A把静态变量s=0从主内存中读取到工作内存,再把s=3的更新值写入主内存。

这从单线程的角度来看,完全没有任何问题。

但是如果在程序中引入线程B,线程B执行如下代码:

System.out.println("s="+s);

则会出现2种结果,分别为s=0或者s=3。

出现s=0结果原因:线程A在工作内存中更新的s变量后,不会立即同步到主内存,所以虽然线

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值