zoukankan      html  css  js  c++  java
  • Volatile变量

    1.Volatile变量

    volatile变量是java提供的一种稍弱的同步机制,用来确保将变量的更新操作通知到其他的线程。对volatile变量的读写可简单的认为是有同步块的,但是依赖volatile变量来控制状态的可见性并不推荐。volatile变量可以做到的是保证可见性,但并不确保原子性。

    2.Volatile使用

    • 常用于线程之间状态信息的同步,典型的用法是状态标记位。
    volatile boolean switch;
    doSomething();
    while(switch) {
    doOtherthing();
    }

    java5之后其确保了volatile变量的一致性,即线程从对象中读取到的volatile变量的值就是上次写入的值。

    • 那么来了几个问题

    1. 怎么做到的呢?也就是怎么做到volatile字段的值在所有线程中的值和CPU缓存中的值是一致的或者说保持同步的?

      --出现volatile字段的difference都会加入一条CPU指令,即内存屏障,一旦volatile字段值发生变化就会触发CPU缓存更新。

    2. 那多个CPU如何更新的呢,多核时代么,CPU1已更新是如何保证CPU2缓存也一定被更新的,这个一致性、可见性是如何实现的?

    --首先多个就更新多个CPU的缓存,怎么保证多个CPU都被更新的,内存屏障。那么内存屏障如何实现的呢?ok自己放狗吧。

    3.这种方式对性能的影响?毕竟是同时更新多个CPU缓存,乱序没了,优化没了。

    --有,频繁的volatile字段写操作肯定会对性能产生一定的影响。解决呢?不要频繁写,读无问题。

    • 错误使用方式

    比如使用volatile字段进行递减递增的操作

    private static final int SUM = 1;
    private volatile
    int count; doSomething(); count++; if(SUM == count) { doOtherthing(); }

    假设:

    Thead1处理时 count=0,然后count++, 那么count=1;

    Thead2处理时 count=0,然后count++, 如果此时Thread1的count++操作未完成,那么count=0,那么count++后,count=1;

    从而执行了两次count++,但是结果呢,count=1。

    •  可使用volatile变量的条件

    1.对变量的写入操作不依赖于变量的当前值,或只有一个线程去更新变量的值

    2.变量不会和其他状态变量一起被当做不变形的条件

    3.在访问变量时不需要加锁

     

     参考:

    java并发编程实战(32-34)

    java性能优化权威指南(171)

  • 相关阅读:
    图解:在资深架构师眼中的架构应该是怎样的?
    面试必看|面试官之间的“潜规则”
    职业规划:专属程序员的巡礼之年
    互联网企业如何应对网站架构演化带来的“蝴蝶效应”
    阿里首席架构师,是如何选择并落地架构方案的
    你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构
    大型分布式电商系统架构演进史?
    大厂面试官:Java工程师的“十项全能”
    打包签名时出现Conversion to Dalvik format failed with error 1
    Android项目混淆打包
  • 原文地址:https://www.cnblogs.com/zyhxhx/p/4567808.html
Copyright © 2011-2022 走看看