线程安全性(三)

可见性

不可见的原因.jpg
synchronized.png
image.png

volatile变量在每次被线程访问时都强迫从主内中读取该变量的值,而该变量发生变化时都会强迫线程将该变量的值刷新到主内存中,这样,任何时候所有线程都能看到该变量的最新值

volatile写.png
volatile读.png
 /**
     *  当两个线程同时执行了第一步, 就都读到了count的值, 比如是5
     *  两个线程同时执行了+1操作并写回主存,这样就丢了一次+1的操作,结果是6问不是5
     */
    public static void add(){
        // 1. 去读内存中的count值
        // 2. +1
        // 3. count写回主存
        count++;
    }

volatile 不具有原子性

使用volatile需要具备两个条件:

  1. 对变量的写操作不依赖于当前值
  2. 该变量没有包含在具有其他变量的不变的式子中,因此volatile特别适合作为状态标记量。
    boolean.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文基于周志明的《深入理解java虚拟机 JVM高级特性与最佳实践》所写。特此推荐。 衡量一个服务性能的高低好坏,...
    阳光的技术小栈阅读 1,233评论 0 3
  • 线程同步 在大多数实际的多线程应用中, 两个或两个以上的线程需要共享对同一数据的存取。多个线程或者进程在读写一个共...
    Steven1997阅读 2,081评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 43,002评论 11 349
  • 时过境迁,随着岁月的变化,我们越走越远。多想还像个孩子一样,捡起地上的沙子,从手间滑过,不曾被风吹起,不曾被雨...
    二十二岁的星期五阅读 526评论 4 1
  • 医生正直且有职业素养,手术台上本应生死有命,她却偏执地不认命,因此痛苦不已;警察冷静缜密且忠肝义胆,为维护正义,不...
    李白云阅读 413评论 3 3

友情链接更多精彩内容