相关疑难解决方法(0)

关于可见性及时性的易失性的详细语义

考虑一下volatile int sharedVar.我们知道JLS为我们提供了以下保证:

  1. 写入线程的每个动作在w其写入值之前isharedVar程序顺序happens-before写入动作;
  2. 的值写入i通过w happens-before的成功读取isharedVar由读取线程r;
  3. 成功读取isharedVar由读线程r happens-before的所有后续行动r的程序顺序.

然而,仍有给出没有挂钟时间的保证,当读线程将观察值i.一个完全不会让读取线程看到该值的实现仍然符合此契约.

我已经考虑了一段时间,我看不到任何漏洞,但我认为必须有.请指出我的推理漏洞.

java volatile java-memory-model

21
推荐指数
1
解决办法
1086
查看次数

java重新排序和内存模型

我在java规范中看到这个:

如果x和y是同一个线程的动作,并且x在程序顺序中出现在y之前,则x发生在y之前.

还有这个

原始代码
线程1
r2 = A;
B = 1;

有效的编译器转换(允许编译器对任一线程中的指令重新排序,当这不影响该线程的独立执行时)
线程1
B = 1;
r2 = A;

我对这两件事很困惑.
如果动作x在动作y之前出现,那么x应该在y之前发生.如果我们认为对于y而言r2 = A而对于y则考虑B = 1,则r2 = A应该在B = 1之前发生.怎么会有任何重新排序,如果在y为真之前x发生,那么在r2 = A之前如何执行B = 1?

java

7
推荐指数
1
解决办法
556
查看次数

标签 统计

java ×2

java-memory-model ×1

volatile ×1