ShopJsp 最专业权威的商城系统提供商,最适合二次开发的商城系统! 快速联系通道    电话:010-62910181  手机:18611625933   QQ:94367128

java中volatile关键字如何解析

2016-01-18  来源:华宇盈通

在java的学习中,我们会遇到很多的知识点,因此想要深入的去了解更多的java功能,就要去了解更多的知识点来丰富自己的了解,今天我们主要来说一说Java中volatile关键字如何解析。

public class ThreadSee { 

//t1线程会根据flag的值做对应的操作,主线程会更改t1的值 

 public static void main(String[] args) throws InterruptedException { 

    ThReadTest th= new ThReadTest(); 

    Thread t1 = new Thread(th); 

    t1.start(); 

    Thread.sleep(1000); 

    th.changeFlag(); 

    Thread.sleep(2000); 

    System.out.println(th.getFlag()); 

  } 

  

  

  

class ThReadTest implements Runnable{ 

  

  //线程访问变量时会把其load到对应的线程栈中,每次操作时都要获取内存中最新的数据 

  private volatile boolean stopflag; 

  @Override

  public void run() { 

    int i=0; 

    while(!stopflag){ 

      i++; 

      System.out.println("=="+Thread.currentThread().getName()); 

    } 

    System.out.println("Thread finish:"+i); 

  } 

  public void changeFlag(){ 

    this.stopflag=true; 

    System.out.println(Thread.currentThread().getName()+"***********"); 

  } 

  

  public boolean getFlag(){ 

    return stopflag; 

  } 

}

上述代码如果去掉volatile,但是以上的操作会一直死循环执行下去,但是volatile不能保证线程安全的同步,再来看看一下的代码:

public class ThreadSave implements Runnable{ 

  static ThreadSave sync = new ThreadSave(); 

  static volatile int j=0; 

  //Lock lock =new ReentrantLock(); 

  public void inscane(){ 

    // lock.lock(); 

    for(int i=0;i<10000000;i++){ 

      j++; 

    } 

   //  lock.unlock(); 

  } 

  @Override

  public void run() { 

    inscane(); 

  } 

  public static void main(String[] args) throws InterruptedException { 

    Thread t1 = new Thread(sync); 

    Thread t2 = new Thread(sync); 

    t1.start(); 

    t2.start(); 

    t1.join(); 

    t2.join(); 

    System.out.println(j); 

  } 

}

volatile只会保证线程去做一个检查当前线程栈的变量值和主内存中数据值是否一样的这么一个动作,只此而已。而lock或者是synchronized 会保证某一时刻只有单个线程进入该方法,从而确保其线程安全性。所以在如果多个线程去修改一个volatile变量那么没有实际的逻辑意义。如果一个线程去修改其他的线程依赖修改的变量值,此时是有作用的。

以上就是java中volatile关键字解析的方法,如果你对这方面的内容比较感兴趣,希望以上内容对你有所帮助。

 
在线咨询