使用volatile关键字的基本线程功能

时间:2015-05-24 10:59:45

标签: java multithreading

我需要澄清与基本线程功能和易失性方法有关的内容。在给定的示例中:

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进入无限循环。请解释它是如何在内部发生的......我的意思是两个线程都指的是同一个对象,而且挥发性有什么不同。我真的很困惑...... :(

1 个答案:

答案 0 :(得分:0)

基本上发生的事情是JVM通常允许线程缓存实例或类变量的副本,即每个线程可能有自己的副本。如果一个副本由一个线程更新,则另一个线程可能看不到新值。通过创建变量 volatile ,JVM将不允许线程缓存变量的副本,并且变量保存在单个位置(主内存)中,因此如果多个线程正在读取值,则它们将获得同样的结果。