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

Rhy*_*hys 6 java concurrency multithreading

拿这个帖子:

a = 3; b = 3;

并采取这个线程:

b = 5; a = 5;

它们都从Monitor访问相同的数据.

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

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

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