最近在我的一次采访中,我得到了一个关于多线程的问题让我感到困惑,所以只是为了清楚我的概念,我就是在问这个问题。
问题是"是否有任何可能的执行情况可以为我提供输出,例如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();
}}
答案 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