对于volatile关键字,大家都很熟悉,字面意思也比较简单,线程共享,每个线程都能读取到主内存的最新数据,但真的用好就不是那么简单的事,为什么需要volatile来线程共享?又为什么线程读取的不是最新的数据而需要volaile来实现呢?volatile能不能保证线程安全呢?

首先要理解线程安全是什么,当不同的线程在并发运行的时候,修改的数据在不同的线程显示不同的数据,发生脏读,比如a线程修改了张三的金额从100-10=90,而b线程获取的张三金额还是100,这时候就出现了脏读,多线程个线程导致了线程不安全。Jvm虚拟机内存模型规定所有变量都存在主内存中(类似于计算机的物理内存),为了高效性,每个线程都有自己的内存,所以线程对变量的操作都会在自己工作内存中运行,因此多个线程处理一个共享变量的时候,这时候就会出现线程安全问题。

其实这时候就能想到了thredLocal,作用就是保证在多线程的情况下,每个线程都可以处理自己独立的变量,存储在自己独立的map中,那么既然java线程既然本身就是在线程独立内存运行的,为何多此一举又出现了threadLocal,这就是上面说的,为了解决多个线程处理同一个共享变量时候出现的线程不安全问题。

言归正传,volatile有三个重要的特性,可见性,有序性,线程不安全性,如果大家吧前面的看完之后,基本就可以理解可见性了,可见性就是线程在处理变量的时候,不会从自己的内存中获取,而是才能够java堆里面获取其他线程也会改变的量,这个量也可以称为最后值,永远是最新的,而有序是保证他不会重新排序,java会对有延迟的代码进行重新排序,在不影响结果的情况下,效率块的代码会放到前面执行,但volatile会保证代码不会重排序。线程是否安全呢,答案是否定的,他能保证可见性和有序性,但是不能保证原子性,因为java里的运算是非原子的,比如jvm处理一个变量需要先load到线程栈中,然后在线程栈中改变值,最后在线程退出的时候,才会改变java堆的值,这些操作不会保证原子性,synchronized可以保证原子性,说明他和synchronized不同的是,线程非安全的。

那么他可以保证线程安全吗,如果保证两点,一就是运算的结果不依赖变量的最新值,或者保证只有一个线程才能改变那个值,也就是变量值不会共享,二就是变量不需要与其他状态变量共同参与不变约束。

讲到这里就解释完了,如果有什么意见或者不对的地方,欢迎提出评论,或者与本人私聊商讨。

Volatile能不能保证线程安全?相关推荐

  1. volatile变量能确保线程安全性吗?为什么?

    1. volatile是什么? 在谈及线程安全时,常会说到一个变量--volatile.在<Java并发编程实战>一书中是这么定义volatile的--"Java语言提供了一种稍 ...

  2. Java并发,volatile+不可变容器对象能保证线程安全么?!

    <Java并发编程实战>第3章原文 <Java并发编程实战>中3.4.2 示例:使用Volatile类型来发布不可变对象 在前面的UnsafeCachingFactorizer ...

  3. java和线程相关的关键字有哪些_Java中有哪些机制来保证线程安全?synchronized关键字和volatile关键字...

    想要解决线程安全问题,首先要知道为什么会造成线程不安全? 在单线程中,我们从来没有提到个线程安全问题,线程安全问题是只出现在多线程中的一个问题.因为多线程情况下有共享数据,每个线程都共享这些数据并对这 ...

  4. java volatile线程可见_吃透Java并发:volatile是怎么保证可见性的

    前言 volatile关键字能够保证可见性和有序性,但是volatile为什么能够保证可见性和有序性?为什么volatile又不能保证原子性? 今天,我们从CPU多核缓存架构出发,结合MESI缓存一致 ...

  5. volatile不能保证线程安全

    对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事. 这篇文章将从多个方面来讲解volatile,让你对它更加理解 ...

  6. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?

    欢迎关注方志朋的博客,回复"666"获面试宝典 阅读此篇文章,你需要有以下知识基础 Java内存模型,可见性问题 CAS HashMap底层原理 我们知道,在日常开发中使用的Has ...

  7. Java并发编程 synchronized保证线程安全的原理

    文章转载致博客 blog.csdn.net/javazejian/- 自己稍加完善. 线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源 ...

  8. Java并发编程—volatile关键字(保证变量的可见性、有序性机制)

    原文作者:Matrix海子 原文地址:Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程 ...

  9. shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

    概念 compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新值(B).如果内存位置的值与预期原值相匹配,那么 ...

  10. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

最新文章

  1. VUE做一个公共的提示组件,显示两秒自动隐藏,显示的值父组件传递给子组件
  2. Matlab与线性代数--矩阵的正交分解
  3. Codeforces problem 67E(多边形求内核的应用)
  4. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序
  5. Android中文API(122) —— AudioRecord
  6. 史上最详细MySQL5.5复制配置步骤,与以前版本的有所不同
  7. 互融云融资担保系统:助力企业解决融资难题
  8. 知识整理2019清北学堂提高储备D1
  9. oc语言的优缺点有哪些
  10. MDK5之.map文件解析
  11. cjson构建_利用cJSON解析和创建JSON字符串
  12. C# 实现Windows Media Encoder音视频捕捉
  13. Angularjs的http请求
  14. C盘清理方法——基于spacesniffer软件和PatchCleaner软件
  15. MATLAB三维图像与三重积分
  16. 大学杂念集 随便写写
  17. [ZJOI2007]矩阵游戏(二分图匹配、匈牙利算法)
  18. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化
  19. Swing批量重命名并导出excel
  20. cellpadding ,cellspacing的意思

热门文章

  1. js表单提交 php,提交表单:js中form表单是如何提交的
  2. Office2016专业版打开超链接时提示“您的组织策略阻止我们为您完成此操作。...”问题解决
  3. 公司法定代表人的法律风险及防范
  4. 我为什么学习设计模式
  5. python计算手机销量年增长率_python如何计算环比增长率
  6. Statements must be separated by newlines or semicolons
  7. 【随便说说】|| 老师用腾讯会议开直播,实在忍不住了,我......
  8. 【新年礼物】分享十个珍藏学习编程的网站,助大家2022如虎添翼
  9. 易基因 | 转录组测序在原核生物研究中的应用(4)| 文献科普
  10. 按摩器具抽查三成不合格 选购需注意哪些?