Java内存模型中线程分歧行动和外部行动的例子

 2023-01-21    298  

问题描述

我目前正在学习有关Java内存模型的知识,我想到了不同种类的动作.

有两个我不完全理解:

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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。