join()如何工作? (Java中的多线程)
我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解.
问题 (多重选择):下面的程序的一些可能的结果是什么? 一个) B) C) D) 该程序 public class Thread2 extends Thread { static int value = 0; static Object mySyncObject = new Object(); void increment() { int tmp = value + 1; value = tmp; } public void run() { synchronized(mySyncObject) { increment(); System.out.print("Value is " + value); } } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread2(); Thread t2 = new Thread2(); t1.start(); t2.start(); t1.join(); t2.join(); System.out.print("Final value is " + value); } } 正确的答案是:A),C)和D). 对于情况A)我不明白两个线程(从同步块(!)中增加一个看似静态的变量)的最终可能会被设置为1,最终的值也是1? 情况C和D对我来说同样令人困惑,因为我真的不明白main()在所需的线程(t1和t2)之前完成的可能性如何.我的意思是,他们的join()方法已经从main函数中被调用了,所以要理解主要函数应该是等到t1和t2都用它们的run()方法完成(并且打印出它们的值) …? 如果有人可以引导我,这将是非常棒的. 提前感谢,非常感谢! 解决方法答案或问题有问题.你对join()的理解是正确的.直到两个线程完成后才能打印“最终值”消息.对join()的调用确保了这一点. 此外,increment()方法只能从一个静态字段中键入的同步块中调用.所以没有办法这个方法可以同时被两个线程调用. “Value is”输出也在同一个同步块内.因此,除了在同步块内,任何地方都不能访问value属性.因此,这些操作是线程安全的. 该程序唯一可能的输出是“值为1.值为2.最终值为2.” (实际上,输出之间没有时间段或空格 – 我只是匹配答案的格式.) 我无法解释为什么这不符合任何答案,除了谁写的问题弄乱了一些事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |