2017-10-06 35 views
-2

最近在我的一次采访中,我得到了一个关于多线程的问题,这个问题让我很困惑,所以为了清除我的概念,我问了这个问题。在java中执行线程后可能的输出

的问题是“是否有任何可能的执行情况,可以给我像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(); 
}} 
+0

为什么这个问题一直往下投我已经给了明确的问题说明,这是非常有用的了解线程concept.So请不降反升的投票尽量给予正确的答案.. 。 – user7324139

回答

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