【问题标题】:Possible output after execution of threads in java在java中执行线程后可能的输出
【发布时间】:2017-10-06 00:54:09
【问题描述】:

最近在我的一次采访中,我遇到了一个关于多线程的问题,这让我很困惑,所以为了澄清我的概念,我问了这个问题。

问题是“是否有任何可能的执行场景可以为我提供以下代码的输出,例如 7 6 5 或 7 5 6”

public class SampleThread implements Runnable {
 static int x = 4;

 public void run() {
    x++;
    System.out.println(x);
 }
}

现在假设有 3 个线程实例具有与目标对象相同的可运行实例,如下所示

public class Test {

public static void main(String[] args) {

    SampleThread s1=new SampleThread(); 

    Thread t1=new Thread(s1);
    Thread t2=new Thread(s1);
    Thread t3=new Thread(s1);

    t1.start();
    t2.start();
    t3.start();
 }}

【问题讨论】:

  • 为什么这个问题被否决了?我已经给出了明确的问题描述,理解线程概念非常有用。所以请不要投反对票,而是尝试给出正确的答案...

标签: java multithreading


【解决方案1】:

是的,记住线程是同时运行的,而不是一个接一个。

由于他们在没有任何同步的情况下写入和读取共享变量,因此很可能会发生内存一致性错误。在这种情况下,您可以肯定地说,增量发生在每个线程的打印操作之前(但并不总是紧接在之前,因为其他线程也可能正在读取或写入)。线程同时读取值、根据过时的值进行更改、在另一个线程更改值后读取这些情况可能会导致输出 765 或 766。

看看Oracle关于并发和内存一致性的文档,非常详细: https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2023-02-22
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多