我已经测试了有关多线程的一些东西。我发现该代码段的持续时间超过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");
答案 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