A and C(假设问题是这些答案中哪些是可能的输出?)
当然,困难的部分不是找到可能的解决方案。相反,它是认真地审视那些你认为是的not可能并尝试让自己相信你有充分的理由解释为什么它不可能and你已经消除了所有绕过你的理由的方法。
到目前为止,我的方法是用英语写下每个线程中可能发生的事情......
您需要找出哪个线程打印了每个数字。下面是我能想到的最有效、最简洁的格式,可以在您处理各种可能性时轻松划掉/擦除/重写。意识到:
-
一旦找到可能的答案move on。无论现实世界中不可能出现这种情况,还是存在其他可能(或不可能)的组合,都没关系。只要你找到了1种可能性,那就够了move on.
-
首先尝试最简单的方法,例如假设每个数字为 T1,直到您遇到一个不可能是 T1 的数字,因此您填写 T2,依此类推。希望您能在没有矛盾(或容易解决的矛盾)的情况下到达最后。一旦找到了可能的组合,就继续吧。
-
请随意跳至排除快速解决可能的问题,以便您可以专注于可能不可能的问题。
这是我的草稿纸/工作表的最终编辑(附有我的心理注释):
A. 0, 2, 4, 4, 6, 8, 10, 6,
1 1 1 2 2 2 2 1 <- possible threads that produced this output - possible solution
B. 0, 2, 4, 6, 8, 10, 2, 4,
1 2 2 2 2 ? 1 <- to print second '2', T1 interrupted between L10/L11; 4 passes of T2 used up
C. 0, 2, 4, 6, 8, 10, 12, 14,
1 1 1 1 2 2 2 2 <- possible solution - simplest solution (T2 waits until T1 is completely done) - doesn't matter that it isn't likely, just that is possible
D. 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14,
1 2 1 2 1 2 1 2 1 2 ? <- threads used up
E. 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14,
1 1 1 1 2 2 2 2 ? <- threads used up
Note:
http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html
- 对于引用变量和大多数原始变量(除 long 和 double 之外的所有类型),读取和写入都是原子的。
- ...
原子操作不能交错,因此可以使用它们而不必担心线程干扰。