加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:24:14 所属栏目:MsSql教程 来源:网络整理
导读:我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解. 问题 (多重选择):下面的程序的一些可能的结果是什么? 一个) 价值是1. 价值是1. 最终值为1. B) 价值是1. 价值是1. 最终值为2. C) 价值是1. 最终值为1. 价值是2. D) 价值是1. 最终值为2
我正在准备考试,经过一些抽样练习(其中包含正确的答案),我根本无法理解.

问题

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

一个)
价值是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.” (实际上,输出之间没有时间段或空格 – 我只是匹配答案的格式.)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读