在java中执行线程后可能的输出

时间:2017-10-06 00:54:10

标签: java multithreading

最近在我的一次采访中,我得到了一个关于多线程的问题让我感到困惑,所以只是为了清楚我的概念,我就是在问这个问题。

问题是"是否有任何可能的执行情况可以为我提供输出,例如7 6 5或7 5 6,用于以下代码"

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

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

现在假设有3个Thread实例与目标对象具有相同的runnable实例,如下所示

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();
 }}

1 个答案:

答案 0 :(得分:0)

是的,请记住线程是并发运行而不是一个接一个地运行。

由于他们在没有任何同步的情况下编写和读取共享变量,因此可能会发生内存一致性错误。在这种情况下,您可以肯定地说,在每个线程中的打印操作之前发生了一个增量(但并不总是在之前,因为其他线程也可能正在读取或写入)。线程同时读取值,基于过时值进行更改,在另一个线程更改值后读取是可能导致输出(如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