拿这个帖子:
a = 3; b = 3;
并采取这个主题:
b = 5; a = 5;
他们都从监视器访问相同的数据。
如果它们同时运行(通过使用线程),可能会产生哪些结果?
答案 0 :(得分:6)
因为线程的操作可以按任何顺序执行,所以a = 3,5和b = 3,5的任意组合都是可能的。
为未来的读者澄清:
Thread-1: a=3 b=3
,
Thread-2: b=5 a=5
可能的运营订单:
I:Thread-1,Thread-1,Thread-2,Thread-2
II:Thread-1,Thread-2,Thread-1,Thread-2
III:Thread-1,Thread-2,Thread-2,Thread-1
IV:Thread-2,Thread-1,Thread-2,Thread-1
V:Thread-2,Thread-2,Thread-1,Thread-1
VI:Thread-2,Thread-1,Thread-1,Thread-2
让我们尝试各自:
I: a=3, b=3, b=5, a=5 --> a=5, b=5
II: a=3, b=5, b=3, a=5 --> a=5, b=3
III: a=3, b=5, a=5, b=3 --> a=5, b=3
IV: b=5, a=3, a=5, b=3 --> a=5, b=3
V: b=5, a=5, a=3, b=3 --> a=3, b=3
VI: b=5, a=3, b=3, a=5 --> a=5, b=3
请注意,有四种方法可以提出a=5,b=3
。因此,如果您有每个线程排序的合理概率,那么您将在67%的时间内得出该结果。但是,您无法保证这种可能性;实际上,您几乎可以肯定操作系统会以某种未知的方式存在偏差。经验教训是,你不应该试图依靠未定义的行为为你做任何事情。
(我知道最后一部分有点超出了问题的范围,但我认为应牢记这一点。)