zoukankan      html  css  js  c++  java
  • volatile关键字的作用

    volatile用于修饰变量

    1 多线程中,有主内存和线程内存的区分,线程内存会持有成员变量的值,如果变量加上这个修饰符,则一个线程修改这个变量的值后,会同步到其他线程(其实是同步到主内存,然后其他线程在使用这个值的时候,再在主内存同步一遍)

    2 多线程中,防止指令重排序

    针对作用1,请看代码

    需求很简单,线程在做一个死循环,当标记为false时,跳出循环

    package sync007;
    
    public class RunThread extends Thread{
    
        private volatile boolean isRunning = true;
        private void setRunning(boolean isRunning){
            this.isRunning = isRunning;
        }
        
        public void run(){
            System.out.println("进入run方法..");
            int i = 0;
            while(isRunning == true){
                /**
                 * JVM会尽力保证内存的可见性,即便这个变量没有加同步关键字。换句话说,只要CPU有时间,
                 * JVM会尽力去保证变量值的更新。这种与volatile关键字的不同在于,volatile关键字会强
                 * 制的保证线程的可见性。而不加这个关键字,JVM也会尽力去保证可见性,但是如果CPU一直有
                 * 其他的事情在处理,它也没办法。最开始的代码,一直处于试了循环中,CPU处于一直被饱受占
                 * 用的时候,这个时候CPU没有时间,JVM也不能强制要求CPU分点时间去取最新的变量值。而加了
                 * System.out.println之后,由于内部代码的同步关键字的存在,导致CPU的输出其实是比较耗
                 * 时的。这个时候CPU就有可能有时间去保证内存的可见性,于是while循环可以被终止。
                 */
    
                // 加了这行代码,线程将会往下执行
    //            System.out.println("aaa");
            }
            System.out.println("线程停止");
        }
        
        public static void main(String[] args) throws InterruptedException {
            RunThread rt = new RunThread();
            rt.start();
            Thread.sleep(1000);
            rt.setRunning(false);
            System.out.println("isRunning的值已经被设置了false");
        }
        
        
    }


    上述代码中,如果isRunning变量没有volatile修饰的话,在不加上注释行代码的情况下,主线程修改的值是永远都到不了其他线程的

  • 相关阅读:
    python模块--time模块
    python模块--如何相互调用自己写的模块
    Animating Views Using Scenes and Transitions
    fragment 切换
    android textview 设置text 字体
    android intent 5.1
    android EditView ime
    animation of android (4)
    animation of android (3)
    animation of android (2)
  • 原文地址:https://www.cnblogs.com/billmiao/p/9872231.html
Copyright © 2011-2022 走看看