• 多线程同步工具——volatile变量


    关于volatile,找了一堆资料看,看完后想找一个方法去做测试,测了很久,感觉跟没有一样。

    这本书《深入理解Java内存模型》,对volatile描述中有这样一个比喻的说法,如下代码所示,对a的读写相当于对b的同步读写。

    public volatile int a = 0;
    private int b = 0;
    
    public synchronized int getB(){
        return b;
    }
    
    public synchronized void setB(int b){
        this.b = b;
    }

    也就是说,volatile只保证了读与写的同步,每次读取都是得到最新值,每次写入都是覆盖最新值。

    因为每个线程有自己的独立内存存储公共变量的副本,非volatile变量,在未使用同步的情况下,即使是单纯的读写,也并非第一时间读写公共内存的变量。换句话说,volatile变量就是为了第一时间读写公共内存的变量,而并非独立内存的变量。

    现在,道理是明白的,接下来主要看它使用的场合和条件。

    1. 写入值不能依赖于读取值,例如a++,其实是一个“先读取,再运算,后写入”的步骤,存在了写入值依赖于读取值。
    2. 如果它除了读与写需要同步外,还需要其它同步的操作,那么其它同步的操作,无疑肯定要借助于synchronized。如果它的读与写的触发频率远远高于其它同步的操作,这时候就可以考滤volatile与synchronized的并用。
    3. 虽然单独使用CAS原子变量可以达到同步,但CAS原子变量是需要循环来确保写入值,有时需要忽略旧值与最新值是否相同,直接把值写入,并且第一时间更新至主内存,这时候就使用volatile变量配合CAS函数,注意不是CAS类对象。

    关于其它的用处,可以查看这篇文章正确使用 Volatile 变量》,今天我就先理解到这些了,有了解深入的小伙伴也分享我一下,谢谢。

  • 相关阅读:
    排序——字符串怀疑人生
    广搜的变形+最短路思想 变色龙
    阿斯顿发发顺丰
    莫队暴力 一知半解
    P3384 【模板】树链剖分
    U74201 旅行计划 树上找链长度
    数据结构:线性表基本操作和简单程序
    数据结构:循环链表实现约瑟夫环
    Codeforces 215D. Hot Days(贪心)
    Codeforces 1080C- Masha and two friends
  • 原文地址:https://www.cnblogs.com/hvicen/p/6235451.html
Copyright © 2020-2023  润新知