join()如何工作? (Java中的多线程)

前端之家收集整理的这篇文章主要介绍了join()如何工作? (Java中的多线程)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解.

问题

(多重选择):下面的程序的一些可能的结果是什么?

一个)
价值是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()方法完成(并且打印出它们的值) …?

如果有人可以引导我,这将是非常棒的.

提前感谢,非常感谢!
芥末

解决方法

答案或问题有问题.

你对join()的理解是正确的.直到两个线程完成后才能打印“最终值”消息.对join()的调用确保了这一点.

此外,increment()方法只能从一个静态字段中键入的同步块中调用.所以没有办法这个方法可以同时被两个线程调用. “Value is”输出也在同一个同步块内.因此,除了在同步块内,任何地方都不能访问value属性.因此,这些操作是线程安全的.

该程序唯一可能的输出是“值为1.值为2.最终值为2.” (实际上,输出之间没有时间段或空格 – 我只是匹配答案的格式.)

我无法解释为什么这不符合任何答案,除了谁写的问题弄乱了一些事情.

猜你在找的MsSQL相关文章