2023-01-21 298
我目前正在学习有关Java内存模型的知识,我想到了不同种类的动作.
有两个我不完全理解:
请解释这两种动作类型,并为它们提供示例,并为其有关编译器重订单和的特殊属性 .哦,本地呼叫也是外部操作吗?
我认为,如果没有什么特别的话,他们不会定义线程差异动作.那么,是什么使它们与众不同,以便需要将它们定义为一种特殊的动作?
现有答案已经正确定义了这些动作是什么.
至于重新排序:查看以下 thread-divergence 操作的示例:
class ThreadDivergence {
int foo = 0;
void thread1() {
while (true); // thread-divergence action
foo = 42;
}
void thread2() {
assert foo == 0;
}
}
您希望这种断言永远不会失败.如果没有线程差操作,就无法保证这是因为可以重新排序设置foo = 42的无法实现的定义以先执行. JMM禁止这一点.
同样,添加了外部动作以避免令人惊讶的结果:
class Externalization {
int foo = 0;
void method() {
jni(); // external action
foo = 42;
}
native void jni(); /* {
assert foo == 0;
} */
}
假设实现了JNI方法来运行相同的断言,则您不会期望这会失败. JIT编译器无法确定任何外部的结果,因此JMM也禁止此类重新排序.
如果我正确理解,外部操作是Java VM进程之外可见的,例如显示窗口,写入文件或连接到套接字.
线程发散动作必须进入无限while(true)循环.
以上所述是小编给大家介绍的Java内存模型中线程分歧行动和外部行动的例子,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/26235.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态