中文站

Java并发的3个核心问题

Java并发的3个核心问题是:可见性,有序性,原子性。

一、可见性

“可见性”问题的本质描述是:在“多CPU/CPU核,且CPU/CPU核内存在高速缓存”的处理器架构中,线程A和线程B分别在不同的CPU/CPU核上运行,A欲对主存作的修改操作并非直接作用于主存而是首先作用于本地的高速缓存,此时B所在CPU/CPU核内的高速缓存并不能感知到这个修改操作。

在Java语境中对于“可见性”问题的描述是:线程A对变量所做的修改操作对线程B不可见。

扩展叙述:

○ 根据以上描述可知,“可见性”问题的产生源于“处理器架构”,故而,其他语言都存在“可见性”问题,比如“Go,Rust”等

○ 如果是“单CPU/CPU核或者CPU/CPU核内不存在高速缓存”的处理器架构,则不存在“可见性”问题

二、有序性

“有序性”问题的本质描述是:

○ 在编译器/解释器的层面,为优化程序执行速度,在遵循一定限制条件前提下,编译器编译/解释器解释得到的目标指令代码可能是经过重排序的

○ 在处理器的层面,为优化指令执行速度,在遵循一定限制条件前提下,指令最终可能重排序执行

扩展叙述:

○ 上述“编译器/解释器层面”指的是“从字节码到机器指令”,而没有涵盖“从Java源代码到字节码”

○ 根据以上描述可知,“有序性”问题的产生源于“编译器/解释器”和“处理器架构”,既然涉及到“处理器架构”,那么其他语言显然同样会存在“有序性”问题

○ 只有当“语言的编译器/解释器不支持为优化程序执行速度而允许重排序目标指令代码”和“处理器不支持为优化执行速度而允许指令重排序执行”同时满足时,才可避免“有序性”问题

三、原子性

原子性的本质描述是:当且仅当操作物理或者逻辑不可中断(不可中断:操作所涉内存不可被读取和修改)时,该操作才是原子的。

关于语言语句和机器指令“是否是原子的”描述如下:

○ 一条机器指令可以是原子的,也可以是非原子的;

○ 当语言的一条语句被编译/解释成多条机器指令时,该条语句是非原子的;当被编译/解释成一条机器指令时,根据上一条论述它既可能是原子的,也可能是非原子的。

作者:罗妙辉

【声明】文章来源于网上采集整理,版权归原作者所有,如有侵权,请邮件反馈yidunmarket@126.com,我们将尽快核实修改。