第1部分:
以下问题来自于edx RiceX: COMP322 Fundamentals of Parallel Programming/Topic 1.1 Quiz的测验:
3.考虑以下伪代码程序。
a = b = 0
async {
a = 3;
b = 5;
}
async {
a = 4;
b = 4;
}
x = a + b
最后,x可能有各种不同的值。有多少不同 x?
的值是可能的
解释中有一条陈述:
由于每个异步中的代码按顺序执行,所以它是 不可能得到总和x = 0 + 5 = 5.
第2部分:
以下是关于类似问题的书Java Concurrency in Practice
的引用:
每个线程中的操作彼此没有数据流依赖, 因此可以无序执行。 (即使他们是 按顺序执行,缓存刷新为main的时间 从B的角度来看,记忆可以使它出现 A中的任务以相反的顺序发生。
根据上述声明,我认为主线程x=a+b
可以看到价值a
的{{1}}和价值0
的{{1}}因为两个操作:b
和5
可以不按顺序执行。即使a=3;
和b=5;
按顺序执行,从主线程的角度来看,它仍然可能会看到a=3;
的值为5且没有看到b=5;
的值为3因为上面提到的潮红问题。
那么,我应该相信哪个答案?测验的解释是错误的吗?它是特定于Java吗?
答案 0 :(得分:1)
那么,我应该相信哪个答案?测验的解释是错误的吗?它是特定于Java吗?
根据我可以看到 1 的背景,测验答案和解释是自洽的。它正在使用/描述与Java不同的并发模型。
来自 Goetz等人的引用对于Java是正确的,但此示例代码不是用Java编写的。
1 - 该链接仅供注册该课程的人阅读。