![]() |
1
11
A和C (假设问题是 哪些答案是可能的输出? ) 当然,最困难的部分不是你找到可能的解决方案。但更确切地说,是要仔细观察你认为是 不 可能的,试着说服自己你有一个不可能的理由 和 你已经排除了所有绕过你的理由的方法。
你需要弄清楚每一个号码是哪根线印的。下面是我能想到的最有效、最简洁的格式,它可以让你在处理各种可能性的时候很容易地划掉/擦除/重写。认识到:
以下是我的草稿纸/工作表的最终编辑(附在我的心理注释之后):
注: http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html
|
![]() |
2
5
我处理多线程问题的方法是分解线程将运行的代码,然后确定有多少线程将运行该代码,以及是否访问其他线程可能使用的任何变量。
在这个例子中,有3个线程。这个
这个
另外两个线程将分别进入
关于这些数字是什么是不可能的,因为
如下文所述,选项B即使有8个输出,也是不可能的。尝试想出一个线程序列来创建该输出。 |
![]() |
3
0
这个问题比看起来更具欺骗性——我越想越喜欢它。我开始讨论我如何看待线程程序——我分析同步点和I/O调用。但除了没有内部同步的println之外,没有其他的。所以我们只剩下随机时间(见
race conditions
)这结合了没有保证的方法来同步
但是,如果我们看看答案,我们可以看到一些答案是不可能出现的。例如,正如@linuxuser27所指出的,每个线程只打印4个数字,这将删除答案,将打印更多的数字。另一个不正确答案的例子是,如果任何答案的值大于14,因为第一个线程可以变为0,2,4,6,第二个线程可以变为8,10,12,14,但不能更高。 因为每个线程必须打印4次数字,并且数字由 每个线程 必须至少是2+上一个线程打印的数字,某些模式无法生成。我不会给出我的答案,但不是“以上全部”,也不是A、B和C。 |