为什么程序持续运行的时间超过3秒?

时间:2018-07-26 08:55:16

标签: java multithreading

我已经测试了有关多线程的一些东西。我发现该代码段的持续时间超过3秒,并且没有打印最后的webuse voter, clear label list // shows two variables with value labels (candidat and inc) drop candidat inc label drop candidat inc2 // we drop all value labels merge 1:1 pop frac using http://www.stata-press.com/data/r14/voter, nogen keepusing(candidat) label list // instead of having only the candidat label, we also have inc 。为什么?

System.out.println("program end");

program run result as follow:

2 个答案:

答案 0 :(得分:0)

不同的线程各自使用不同的内存空间缓存。

这意味着第一个线程在其自己的缓存中具有该变量,而另一个线程在其自己的缓存中具有该变量。因此,每个线程在不同的状态下看到相同的变量。

在两个线程之间没有适当的同步机制的情况下,它们没有理由尝试调和其缓存中的差异。在没有指示的情况下,这样做会严重阻碍表演。

您可以在此处使用的一种非常简单的同步机制是制作变量标志volatile。这将使线程在每次读/写时都在此变量上同步其缓存。

答案 1 :(得分:0)

使用volatile with标志使线程从其本地缓存中读取标志的实际值。

public class hello {
   //make flag volatile
   volatile static Boolean flag = false;
    public static void main(String args[]) throws InterruptedException {
        MyThread t = new MyThread();
        t.start();
        Thread.sleep(3000);
        hello.flag = true;
    }
    static class MyThread extends Thread {

        public void run(){
            System.out.println("Thread start");
            while(true){
                if(hello.flag){
                    break;
                }
            }
            System.out.println("Thread end");//why not print this statement? but run in debug mode, it will print this statement correctly
        }

    }

}

请通过下面的链接查看其工作原理。

https://docs.oracle.com/cd/E19683-01/806-5222/codingpractices-1/index.html