我正在准备SCJP,多线程一直是我最肮脏的区域,主要是因为我不知道如何看多线程代码,并通过它.到目前为止,我的方法是用英文写下每个线程可能发生的情况,并测试一些线程随机相交的情况,这是一个真正的命中和遗漏和耗时的方法.所以我想看看一个专业人士会如何去做.您是否愿意阅读下面的代码(这是最新的问题,让我很麻烦),并记下你的头脑(只有与代码相关的东西,请:),你制定出可能的输出?问题的选择到底是什么.我正在寻找的不是我的解决方案,而是在考试中有效地到达解决方案.
是的,我知道这个问题没有一个确切的答案,等等.接受的投票是最清楚和最容易效仿的答案,好的:)
感谢大家!
问题:哪些答案是可能的输出?
public class Threads1 { int x = 0; class Runner implements Runnable { public void run() { int current = 0; for (int i = 0; i < 4; i++) { current = x; System.out.print(current + ","); x = current + 2; } } } public static void main(String[] args) { new Threads1().go(); } public void go() { Runnable r1 = new Runner(); new Thread(r1).start(); new Thread(r1).start(); } }
选择(选择所有适用):
A. 0,2,4,6,8,10,
B. 0,
C.0,12,14,
D.0,
E.0,
解决方法
A和C(假设问题是哪些答案是可能的输出?)
当然,当您找到可能的解决方案时,困难的部分不是.但是,它要看看你认为是不可能的,并试图说服自己,你有一个坚实的理由,为什么不可能,你已经消除了所有的方法来摆脱你的理由.
So far my approach has been to write down in English what might be happening in each thread …
你需要弄清楚每个号码打印哪个线程.以下是我可以想到的最有效率,简洁的格式,并且使您可以在完成可能性时轻松交叉/擦除/写入.实现:
>一旦找到可能的答案就行了.如果不可能在现实世界中或者可能存在其他可能的(或不可能的)组合,这并不重要.只要你发现一个可能性,那就是你需要继续前进的一切.
>首先尝试最简单的方法,例如假设T1为每个数字,直到你打到不能T1的数字,所以你填写T2,等等..希望你到最后没有矛盾(或矛盾很容易解决).找到可能的组合后,继续.
>随意跳过去,尽快消除可能的,所以你可以专注于可能不可能的事情.
这是我的划痕纸/工作表的最终编辑(附加了我的精神注释):
A. 0,1 1 1 2 2 2 2 1 <- possible threads that produced this output - possible solution B. 0,1 2 2 2 2 ? 1 <- to print second '2',T1 interrupted between L10/L11; 4 passes of T2 used up C. 0,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,1 2 1 2 1 2 1 2 1 2 ? <- threads used up E. 0,1 1 1 1 2 2 2 2 ? <- threads used up
注意:
http://download.oracle.com/javase/tutorial/essential/concurrency/atomic.html
- Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).
- …
Atomic actions cannot be interleaved,so they can be used without fear of thread interference.