美文网首页
02.并发编程之volatile

02.并发编程之volatile

作者: commence | 来源:发表于2017-05-12 10:52 被阅读19次

    1、volatile使变量在多个线程间可见

    private volatile int a;</br>
    a始终在线程间保持一致性,一方修改,其他方立马识别出来相应的变化。</br>
    原来的做法是:使用加锁,保证变量被锁,修改完后,将修改后的值同步到共享内存中,其他线程获取锁再去使用,效率不高,同一时刻只有一个在使用。</br>
    JKD1.5后,每一个线程做了个优化,每个线程有独立的内存空间(线程工作内存),将主内存中线程引用的对象或变量副本COPY到该独立内存空间,目的是效率更高,省了每次到主内存中取。

    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方法..");
            while(isRunning==true){}
            System.out.println("线程停止");
        }
        public static void main(String[] args) throws InterruptedException {
            RunThread rt = new RunThread();
            rt.start();
            Thread.sleep(3000);
            rt.setRunning(false);
            System.out.println("isRunning的值已经被设置了false");
            Thread.sleep(1000);
            System.out.println(rt.isRunning);
        }
    }
    

    上述是两个线程引用同一个变量isRunning,其中main为主线程。</br>
    isRunning变量如果被volatile修饰,则当变量改变时强制引用isRunning的线程使用线程执行引擎去主内存里去读取。</br>
    volatile只具备可见性,但不具备原子性。
    private static volatile int count;需要使用private static AtomicInteger count = new AtomicInteger(0);代替,注意不能保证多个线程间的多个addAndGet原子性,只能加锁。

    2、netty底层大量使用了volatile

    相关文章

      网友评论

          本文标题:02.并发编程之volatile

          本文链接:https://www.haomeiwen.com/subject/lodztxtx.html