02.并发编程之volatile

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,391评论 11 349
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,757评论 0 11
  • 第三章 Java内存模型 3.1 Java内存模型的基础 通信在共享内存的模型里,通过写-读内存中的公共状态进行隐...
    泽毛阅读 4,396评论 2 22
  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,899评论 1 19
  • 一转眼。时间如梭,我升到了高二.原本清闲的日子开始繁忙.天天就是学校家里的来回走动,来不及欣赏晚霞,来不及回顾曾经...
    盛夏如初见阅读 260评论 0 3