关于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 变量》,今天我就先理解到这些了,有了解深入的小伙伴也分享我一下,谢谢。

转载于:https://www.cnblogs.com/hvicen/p/6235451.html

多线程同步工具——volatile变量相关推荐

  1. java线程同步barrier_Java多线程同步工具类之CyclicBarrier

    一.CyclicBarrier使用 CyclicBarrier从字面上可以直接理解为线程运行的屏障,它可以让一组线程执行到一个共同的屏障点时被阻塞,直到最后一个线程执行到指定位置,你设置的执行线程就会 ...

  2. 线程同步锁 java_java多线程同步之重入锁,详细解析

    上次已经为大家介绍过java多线程同步,Volatile详解的主要内容了.今天再来为大家介绍一些相关的内容,也就是java多线程同步之重入锁,一起来了解一下吧. 使用重入锁实现线程同步 在JavaSE ...

  3. java volatile 死锁_Java 多线程:volatile 变量、happens-before 关系及内存一致性

    原标题:Java 多线程:volatile 变量.happens-before 关系及内存一致性 来源:ImportNew - paddx 更新 请参考来自 Jean-philippe Bempel ...

  4. java线程条件变量_多线程同步条件变量(转载)

    最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...

  5. 【牛客网java笔试题】以下多线程对int型变量x的操作,哪几个不需要进行同步

    以下多线程对int型变量x的操作,哪几个不需要进行同步(    ) A.x=y; B.x++; C.++x; D.x=1; A.由于y的值不确定,所以要加锁: B,C 两个在多线程情况下是必须要加锁的 ...

  6. 16_张孝祥_多线程_同步工具CyclicBarrier与CountDownLatch

    转载: CyclicBarrier的用法 CountDownLatch(倒计时计数器)使用说明 参考: CyclicBarrier和CountDownLatch区别 CyclicBarrier Cyc ...

  7. Java高并发编程:同步工具类

    内容摘要 这里主要介绍了java5中线程锁技术以外的其他同步工具,首先介绍Semaphore:一个计数信号量.用于控制同时访问资源的线程个数,CyclicBarrier同步辅助类:从字面意思看是路障, ...

  8. 从缓存行出发理解volatile变量、伪共享False sharing、disruptor

    volatile关键字 当变量被某个线程A修改值之后,其它线程比如B若读取此变量的话,立刻可以看到原来线程A修改后的值 注:普通变量与volatile变量的区别是volatile的特殊规则保证了新值能 ...

  9. java多线程同步5种方法

    一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会 ...

最新文章

  1. 鹿晗都有AI粉了,为什么AI换脸剧的效果还这么渣?
  2. 转发: Visual Studio 2005常用插件
  3. 2020牛客暑期多校训练营(第六场)
  4. 高能干货:OpenCV看这篇就够了,9段代码详解图像变换基本操作
  5. jQuery效果-----fadeIn()、fadeOut()、fadeToggle()、fadeTo()
  6. 设置networkx中每个节点的位置
  7. 学计算机用苹果本,新手小白用苹果电脑搞科研,学会这些才不至于尴尬!
  8. Oracle数据库基础练习(一):Oracle数据库查询操作练习81题
  9. JVM之运行时栈帧的结构(基于《深入理解Java虚拟机》之第八章虚拟机字节码执行引擎)(上)
  10. 高并发高负载网站系统架构
  11. 如何在Excel中使用公式将生日自动转换成星座?
  12. 5、实现登陆功能:如果用户名输入“tom”,密码“123”,提示登陆成功,否则提示输入错误,请重新输入!您还有XX次机会。 三次输入错误后将不可以再输入,并提示对不起,你的账号将被锁定
  13. Autosar MCAL-ADC详解(二)-基于Tc27x的cfg软件
  14. 思想决定生活 -《卡耐基成功之道全书》读书笔记
  15. 恭喜HBuilderX用户
  16. IOS之导出p12证书
  17. QA小白的学习之路!!!!
  18. android配置文件保存到本地(SP)
  19. OA审批流程管理,简化审批手续!
  20. Animation(动画的基本原理)

热门文章

  1. java程序设计_Java程序设计-类和对象(笔记)
  2. linux系统awk、sed,Linux系统 linux awk sed
  3. python123第六周作业,马哥2016全新Linux+Python高端运维班第六周作业
  4. java 中button和jbutton输出的按钮不一样_Java学习教程(基础)--Java开发环境搭建
  5. FP Growth算法
  6. 系统学习机器学习之模型选择
  7. jfinal 普通java工程_JFinal getModel方法如何在java项目中使用
  8. 【数据库系统原理】实体-联系模型
  9. 为什么java.lang包下的类不需要手动导入
  10. Mysql 哈希索引