JVM之线程安全

作者: LandHu | 来源:发表于2018-12-17 18:54 被阅读13次

并发问题

在了解了JVM结构,特别是内存结构后,我们再说说并发问题产生的原因。在上面的内容中我们分析了Java堆、Java栈,知道Java堆存储的是对象,而Java栈内存是方法执行时所需要的局部变量,其中就包括堆中对象的引用,如果多个线程同时修改堆中同一引用对象的数据,就可能会产生并发问题,导致多个线程中某些线程得到的数据值与实际值不符,造成脏数据。

这种问题为什么会发生?

内存同步
事实上,线程操作堆中共享对象数据时并不是直接操作对象所在的那块内存,这里称之为主内存;而是将对象拷贝到线程私有的工作内存中进行更新,完成后再将最新的数据值同步回主内存,而多个线程在同一时刻将一个对象的值改得七七八八,然后再同时同步给对象所在的内存区域,那么以谁更新的为准就成了问题。

处理器优化和指令重排
还有一种硬件问题也比较重要,那就是为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序执行处理。这就是处理器优化。
除了现在很多流行的处理器会对代码进行优化乱序处理,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排。
可想而知,如果任由处理器优化和编译器对指令重排的话,就可能导致各种各样的问题。

CPU和缓存一致性
我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。
刚开始,还相安无事,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。
所以,人们想出来了一个好的办法,就是在CPU和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。他的特点是速度快,内存小,并且昂贵。
那么,程序的执行过程就变成了:
当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
而随着CPU能力的不断提升,一层缓存就慢慢的无法满足要求了,就逐渐的衍生出多级缓存。
那么,在有了多级缓存之后,程序的执行就变成了:
当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。
单核CPU只含有一套L1,L2,L3缓存;
如果CPU含有多个核心,即多核CPU,则每个核心都含有一套L1(甚至和L2)缓存,而共享L3(或者和L2)缓存。
在CPU和主存之间增加缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据的缓存内容可能不一致。

缓存一致性问题.jpg

其他:

再有人问你Java内存模型是什么,就把这篇文章发给他
一张图看懂JVM


技术讨论 & 疑问建议 & 个人博客

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,转载请注明出处!

相关文章

  • 深入JVM内核原理-4.JVM锁

    1.JVM锁概要 JVM锁概要.png 2.线程安全 JVM线程安全1.pngJVM线程安全2.png 3.对象头...

  • JVM之线程安全

    并发问题 在了解了JVM结构,特别是内存结构后,我们再说说并发问题产生的原因。在上面的内容中我们分析了Java堆、...

  • 深入理解JVM(第二章笔记)

    JVM内存区域 jvm 按照线程安全进行分类:线程私有: 程序计数器,Java虚拟机栈,本地方法栈线程共享: Ja...

  • 高效并发

    从JVM的角度看一下Java与线程,内存模型,线程安全以及JVM对于锁的优化 硬件内存模型与JVM内存模型 硬件的...

  • 关于绝对线程安全和相对线程安全的思考

    Brian Goetz的《Java并发编程实战》有对线程安全的定义: 周志明在《深入理解JVM》中认为上述线程安全...

  • MM 小册子

    hashmap和hashtable区别线程安全,非线程安全 为什么产生死锁相互占有对方需要争夺的资源 jvm类加载...

  • 分布式锁都有哪些实现方案?

    一、业务场景 同一个jvm里多个线程操作同一个有状态的变量,可以通过JVM内的锁保证线程安全。 如果是多个JVM操...

  • 深入JVM内核7 锁

    深入JVM内核 目录 1. 线程安全 多线程网站统计访问人数使用锁,维护计数器的串行访问与安全性 多线程访问Arr...

  • 深入理解JVM第十三章笔记

    深入理解JVM第十三章笔记 线程安全 对“线程安全”一个比较准确的定义: 当多个线程访问同一个对象时,如果不用考虑...

  • 从JMM引申到线程安全

    1、世界存在线程安全问题2、提出JMM规范3、JVM实现参考JMM,解决线程安全问题 JMM定义屏蔽掉各种硬件和操...

网友评论

    本文标题:JVM之线程安全

    本文链接:https://www.haomeiwen.com/subject/wyeckqtx.html