作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下用 Java 编写的多线程代码:
共享变量:
boolean n; // non-volatile
volatile boolean v; // volatile
线程 1:
v = true;
System.out.println("n=" + n);
线程 2:
n = true;
System.out.println("v=" + v);
假设最初n = v = false
。
现在:
v=false
的输出是否意味着 n=true
的输出?n
是可变的,会发生什么变化?n
是 java.util.List
会发生什么变化(以便 n = true
变为 n.add("something")
并且输出 n=true
转换为 ["something"]
)?v
是 AtomicBoolean
并且对它的所有读取和写入都是使用 compareAndSet
执行的语义?您能根据 Java 内存模型论证您的立场吗?
UPD:请将 System.out.println("n="+ n)
视为对 n
的读取。 v
也是如此。
UPD2:您能否提供对第 1 和第 4 种情况的一些分析,如 JSR-133 秒所示。 8?
最佳答案
这里涉及两个因素。
volatile
字段,但是System.out.println
的同步
调用,这起到了读/写屏障的作用在两个线程中,您都在执行写入和读取。写入屏障并不能保证读取屏障。
Does the output of v=false imply the output of n=true?
如果您看到 v=false
,您可能会看到 n=false
,反之亦然
What would change if n were volatile?
并非如此,您可能会看到行为发生变化,具体取决于您运行的架构,但是您仍然可以看到某些机器的不确定行为。
What would change if n were java.util.List
主要的变化是你正在替换写屏障,例如n = true
with a read barrier n.method
这意味着你不再有写屏障(除了调用同步方法)
这样做意味着线程之间的一致性失败的原因更多。
关于java - JMM 在实践中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39175959/
我通常不会这样做,但我目前正在从事的项目需要几个位于 c 源文件中的函数。 extern "C" { int words(char sentence[]); int match(cha
我是一名优秀的程序员,十分优秀!