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

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".(实际上,输出之间没有句号或空格 - 我只是匹配答案的格式.)

我无法解释为什么这个答案都不匹配,只是写了这个问题的人搞砸了.

  • 你知道他们说了什么.那些能做到的人.那些不能,教导的人. (5认同)
  • 谢谢大家!你的确都是对的.我刚接触了教授(这是我计算机科学课程中旧期末考试的一个问题),结果发现PDF包含错误.- 他妈的!我在这上面浪费了5个多小时......但是非常感谢你. (4认同)
  • 或者说答案只是"以上都不是".顺便说一句,print语句之间不会有句点或空格(如'Value is 1Value is 2Final value is 2`). (2认同)