pkl*_*luz 12 java methods multithreading join synchronized
我正在准备考试,经过一些样本练习(其中包含了正确的答案),我根本无法理解它们.
(多项选择):以下计划的一些可能结果是什么?
A)值为1.值为1.最终值为1.
B)值为1.值为1.最终值为2.
C)值为1.最终值为1.值为2.
D)值为1.最终值为2.值为2.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
正确答案是:A),C)和D).
对于情况A)我不明白两个线程(在同步块(!)中增加一个看似静态的变量之后)最终被设置为1并且最终值也是1的可能性是多少?
案例C和D对我来说同样令人困惑,因为我真的不明白main()在两个必需的线程(t1和t2)之前完成的可能性.我的意思是,他们的join()方法已经从main函数中调用了,所以据我所知,应该要求main函数等到t1和t2都用run()方法完成(因此打印了它们的值) ...?
如果有人能引导我完成这件事,那真是棒极了.
在此先感谢,非常感谢!芥末
Eri*_*son 24
答案或问题有问题.
你的理解join()是正确的.在两个线程完成之前,无法打印"最终值为"消息.join()确保这一点的电话.
此外,increment()仅从synchronized键入静态字段的块内调用该方法.因此,两个线程无法同时调用此方法."Value is"输出也在同一个同步块内.因此,value除了在synchronized块中之外,无法从任何地方访问该属性.因此,这些操作是线程安全的.
该程序唯一可能的输出是"值为1.值为2.最终值为2".(实际上,输出之间没有句号或空格 - 我只是匹配答案的格式.)
我无法解释为什么这个答案都不匹配,只是写了这个问题的人搞砸了.