02.并发编程之volatile

2017-05-12  本文已影响19人  commence

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

上一篇下一篇

猜你喜欢

热点阅读