java 代码重排_java中的指令重排和发生前关系

在Java并发性实践中,我们多次被告知,我们的程序的指令可以由编译器,JVM在运行时甚至由处理器重新排序。因此,我们应该假设执行的程序不会按照我们在源代码中指定的完全相同的顺序执行指令。

然而,讨论Java内存模型的最后一章提供了一个列出发生前的规则,指示JVM保留哪些指令排序。第一个规则是:

>“程序顺序规则。线程中的每个动作发生在该线程中在程序顺序中稍后的每个动作之前。

我相信“程序顺序”指的是源代码。

我的问题:假设这条规则,我不知道什么指令可能实际重新排序。

“动作”定义如下:

The Java Memory Model is specified in terms of actions, which include reads and writes to variables, locks and unlocks of monitors, and starting and joining with threads. The JMM defines a partial ordering called happens before on all actions within the program. To guarantee that the thread executing action B can see the results of action A (whether or not A and B occur in different threads), there must be a happens before relationship between A and B. In the absence of a happens before ordering between two operations, the JVM is free to reorder them as it pleases.

其他订单规则提及:

>监视器锁定规则。在同一监视器锁上的每个后续锁之前发生监视器锁上的解锁。

>易失性变量规则。对易失性字段的写入在该相同字段的每个后续读取之前发生。

>线程启动规则。在线程上调用Thread.start发生在已启动线程中的每个操作之前。

>线程终止规则。在任何其他线程检测到线程已终止之前,线程中的任何操作都会发生,通过从Thread.join成功返回或通过Thread.isAlive返回false。

>中断规则。另一个线程的线程调用中断发生在被中断的线程检测到中断之前(通过抛出InterruptedException,或调用isInterrupted或中断)。

>终结器规则。对象的构造函数的结束发生在该对象的终结器的开始之前。

>传递性。如果A发生在B之前,B发生在C之前,则A发生在C之前。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值