线程交错 - 可以输出什么结果

时间:2013-01-12 20:08:52

标签: java multithreading concurrency

拿这个帖子:

  

a = 3; b = 3;

并采取这个主题:

  

b = 5; a = 5;

他们都从监视器访问相同的数据。

如果它们同时运行(通过使用线程),可能会产生哪些结果?

1 个答案:

答案 0 :(得分:6)

因为线程的操作可以按任何顺序执行,所以a = 3,5和b = 3,5的任意组合都是可能的。

为未来的读者澄清:

Thread-1: a=3 b=3Thread-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%的时间内得出该结果。但是,您无法保证这种可能性;实际上,您几乎可以肯定操作系统会以某种未知的方式存在偏差。经验教训是,你不应该试图依靠未定义的行为为你做任何事情。

(我知道最后一部分有点超出了问题的范围,但我认为应牢记这一点。)