Java多线程有序性-动力节点

本文探讨了Java多线程中的有序性问题,涉及重排序的概念,包括指令重排序和存储子系统重排序。重排序可能会对多线程程序的正确性产生影响,可能导致线程安全问题。通过volatile和synchronized关键字可以保证内存访问的顺序性。
摘要由CSDN通过智能技术生成

有序性(Ordering)是指在什么情况下一个处理器上运行的一个线程所执行的 内存访问操作在另外一个处理器运行的其他线程看来是乱序的(Out of Order)。

乱序是指内存访问操作的顺序看起来发生了变化。

重排序

在多核处理器的环境下,编写的顺序结构,这种操作执行的顺序可能是没有保障的:

编译器可能会改变两个操作的先后顺序;

处理器也可能不会按照目标代码的顺序执行;

这种一个处理器上执行的多个操作,在其他处理器来看它的顺序与目标代码指定的顺序可能不一样,这种现象称为重排序。

重排序是对内存访问有序操作的一种优化,可以在不影响单线程程序正确的情况下提升程序的性能.但是,可能 对多线程程序的正确性产生影响,即可能导致线程安全问题。

重排序与可见性问题类似,不是必然出现的。

与内存操作顺序有关的几个概念:

源代码顺序, 就是源码中指定的内存访问顺序。

程序顺序, 处理器上运行的目标代码所指定的内存访问顺序。

执行顺序,内存访问操作在处理器上的实际执行顺序。

感知顺序,给定处理器所感知到的该处理器及其他处理器的内存访问操作的顺序。

可以把重排序分为指令重排序与存储子系统重排序两种:

指令重排序主要是由JIT编译器,处理器引起的, 指程序顺序与执行顺序不一样。

存储子系统重排序是由高速缓存,写缓冲器引起的, 感知顺序与执行顺序 不一致。

指令重排序

在源码顺序与程序顺序不一致,或者 程序顺序与执行顺序不一致的情况下,我们就说发生了指令重排序(Instruction Reorder)。

指令重排是一种动作,确实对指令的顺序做了调整, 重排序的对象指令。

javac编译器一般不会执行指令重排序, 而JIT编译器可能执行指令重排序。

处理器也可能执行指令重排序, 使得执行顺序与程序顺序不一致。

指令重排不会对单线程程序的结果正确性产生影响,可能导致多线程程序出现非预期的结果。

存储子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值