我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解.
问题
(多重选择):下面的程序的一些可能的结果是什么?
一个)
价值是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);
- }
- }
正确的答案是:A),C)和D).
对于情况A)我不明白两个线程(从同步块(!)中增加一个看似静态的变量)的最终可能会被设置为1,最终的值也是1?
情况C和D对我来说同样令人困惑,因为我真的不明白main()在所需的线程(t1和t2)之前完成的可能性如何.我的意思是,他们的join()方法已经从main函数中被调用了,所以要理解主要函数应该是等到t1和t2都用它们的run()方法完成(并且打印出它们的值) …?
如果有人可以引导我,这将是非常棒的.
提前感谢,非常感谢!
芥末