Java内存模型以及线程安全的可见性问题

本文深入探讨Java内存模型(JMM)与JVM运行时数据区的区别,解析多线程环境下因CPU缓存和指令重排序导致的可见性问题。通过理解JMM的共享变量、线程间操作及同步规则,掌握解决并发编程中数据一致性难题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java内存模型以及线程安全的可见性问题

1.Java内存模型 VS JVM运行时数据区

1.1定义

JAVA语言规范提出JAVA内存模型,JAVA内存模型是对多线程程序的一些归则。
JVM虚拟机规范提出JVM运行时数据区,JVM运行时数据区描述的是线程共享区域堆、方法区,线程独占区域虚拟机栈、本地方法栈、程序计数器。
在这里插入图片描述

1.2 多线程问题

在这里插入图片描述

1.3 多线程问题原因分析

1.cpu高速缓存导致,程序中在3s时间还存在值获取不到的情况,排除为cpu高速缓存导致,因为cpu缓存协议可保证在极短时间内数据的一致性。
在这里插入图片描述
在这里插入图片描述

  • cpu指令重排序导致
    指令重排:java编译器的指令重排和微处理器指令重排(JIT编译)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    由于在多次的调用中产生了JIT编译,导致指令重排后,不再从主内存获取变量的值,导致代码陷入循环中,一直执行。
    总结:一个线程对某个变量进行修改,另一个线程获取不到变量修改后的值,即为可见性问题,导致原因cpu指令重排。

1.4 可见性问题的解决

在这里插入图片描述

2.Java内存模型具体内容

概述:要了解Java内存模型,首先要了解什么是内存模型,之前在CPU缓存和内存屏障中我们了解到缓存一致性问题以及处理器优化的指令重排序问题。为了保证并发编程中可以满足原子性、可见性及有序性。有一个重要的概念,那就是——内存模型。它解决了 CPU 多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。而Java内存模型就是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题的一种规范。目的是保证并发编程场景中的原子性、可见性和有序性。

2.1 Shared Variables定义

在这里插入图片描述

2.2 线程间操作

在这里插入图片描述

2.3 对同步规则的定义

在这里插入图片描述

2.4 happens-before先行发生原则

在这里插入图片描述

2.6 final在JMM中的处理

在这里插入图片描述

2.7 Word Tearing字节处理

在这里插入图片描述

2.8 double和long的特殊处理

在这里插入图片描述

2.9 Java内存模型回顾

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值