线程安全之可见性问题

本文深入探讨了Java内存模型和JVM运行时数据区的区别,指出Java内存模型是为了解决多线程中的可见性、有序性问题。CPU指令重排和JIT编译器可能导致并发问题,而volatile关键字则用于确保共享变量的可见性。同时,介绍了Happens-before原则作为并发编程的重要概念。文章还涉及了线程间操作和同步规则,帮助理解Java内存管理的关键点。

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

1、Java内存模型 vs  JVM 运行时数据区

 Java语言规范提出      java内存模型

Java虚拟机规范提出    JVM运行时数据区

 2、Java内存模型是一系列规则

3、为什么提出: 

          多线程中的问题:    

                       1、所见非所得

                       2、无法用肉眼去检测程序的准确性

                       3、不同的运行平台有不同的表现

                       4、错误很难重现

CPU指令重排:

       Java编程语言的语义允许 Java编译器(JIT) 和微处理器(CPU)进行执行优化,这些优化

导致了与其交互的代码不再同步,从而导致看似矛盾的行为。

JIT编译器(Just in Time C)

        解释执行:即脚本,在执行时,由语言的解释器将其一条条翻译成机器可识别的指令。

        编译执行:将我们编写的程序,直接编译成机器可以识别的指令码。

beijing/src/com/desperado/jmm at master · zhangwangyan/beijing · GitHub

volatile关键字

           可见性问题:让一个线程对共享变量的修改,能够及时的被其他线程看到。

                            Java内存模型规定:对volatile变量v的写入,与所有其他线程后续对v的读同步

           

要满足这些条件,所以volatile关键字就有这些功能:

           1、禁止缓存:

                 volatile变量的访问控制符会加个ACC_VOLATILE

           2、对volatile变量相关的指令不做重排序。

共享变量定义:

      

线程间操作:

 

对于同步的规则定义:

 

 

 

Happens-before先行发生原则:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值