我需要澄清与基本线程功能和易失性方法有关的内容。在给定的示例中:
public class ThreadDemo {
public static void main(String args[]){
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
Priority_test hi=new Priority_test(Thread.NORM_PRIORITY+2);
hi.start();
try{
Thread.sleep(1000);
}catch(InterruptedException e){
System.out.println("Main thread interrupted");
}
hi.stop();
try{
hi.t.join();
}catch(InterruptedException e){
System.out.println("Interrupted");
}
System.out.println("High priority:"+hi.click);
}
}
public class Priority_test implements Runnable{
Thread t;
long click=0;
private volatile boolean running=true;
Priority_test(int p){
t=new Thread(this);
t.setPriority(p);
}
public void run(){
while(running)
click++;
}
public void start(){
t.start();
}
public void stop(){
running=false;
}
}
所以,'hi'对象在'hi'中创建的currentThread和子线程是常见的。这意味着两者都指向相同的内存位置....在这种情况下,如果currentThread修改变量'running'的值(不使用那么它意味着值被更新到子线程正在读取其值的内存位置.....但我猜其他事情正在发生,我的概念并不清楚,因为没有使用volatile进入无限循环。请解释它是如何在内部发生的......我的意思是两个线程都指的是同一个对象,而且挥发性有什么不同。我真的很困惑...... :(
答案 0 :(得分:0)
基本上发生的事情是JVM通常允许线程缓存实例或类变量的副本,即每个线程可能有自己的副本。如果一个副本由一个线程更新,则另一个线程可能看不到新值。通过创建变量 volatile ,JVM将不允许线程缓存变量的副本,并且变量保存在单个位置(主内存)中,因此如果多个线程正在读取值,则它们将获得同样的结果。