美文网首页
JAVA-内存模型与线程安全

JAVA-内存模型与线程安全

作者: 九号锅炉 | 来源:发表于2019-01-23 15:20 被阅读0次

缓存不一致问题

在单CPU的时代里,随着CPU性能的不断提升,cpu的处理速度远超过cpu访问内存的速度,使得cpu必须等待IO完成,极大的浪费了CPU的性能。因此缓存技术诞生了,缓存可以将cpu经常访问的内存数据复制一份放在缓存中供cpu读取,而访问缓存的速度远比访问内存的速度快的多。但是随着多cpu和多cpu核心的出现,这样的缓存技术出现问题。通常来说,每个线程都会映射到各个CPU核心中并行运行,每个核心都有一个私有的缓存。当线程A将变量i拷贝到缓存A中进行修改但是还没写回到主存当中时,线程B也从主存中拷贝相同的数据到缓存B,因此此时两个缓存里各有一个互不相同的变量i,这就是所谓的缓存不一致问题。为了解决缓存一致性问题,需要处理器访问缓存时遵循一定的协议。不同的CPU硬件生产厂商,具体的实现不一样。Intel的MESI协议最出名。


CPU缓存不一致性

JAVA内存模型

主流语言如C/C++通常使用物理硬件和操作系统的内存模型,因此会由于不同平台上内存模型的差异造成内存访问出错的问题。而JMM通过定义一套规范来屏蔽掉各种硬件和操作系统的内存访问差异,保证java程序在各个平台下达到一致的内存访问效果。而java内存模型(JMM)仿照上述硬件缓存架构的设计,实现了一套JVM层面的缓存一致性。


java内存模型和硬件架构之间的对应关系

JVM运行程序的实体是线程,每个线程都会创建一个类似缓存的工作内存(Working Memory),工作内存保存了该线程用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存的变量。不同线程之间无法直接访问对方工作内存中的变量。线程间的通信是通过共享主内存的方式实现的。

相关文章

  • JAVA-内存模型与线程安全

    缓存不一致问题 在单CPU的时代里,随着CPU性能的不断提升,cpu的处理速度远超过cpu访问内存的速度,使得cp...

  • 高效并发

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

  • Java 线程安全 与 锁

    Java 线程安全 与 锁 多线程内存模型 线程私有栈内存每个线程 私有的内存区域 进程公有堆内存同一个进程 共有...

  • Android下多线程的实现

    Android下多线程相关 线程安全相关问题参考:java内存模型与线程 android下与多线程有关的主要有以下...

  • JAVA

    1.4 Java的 内存模型 是否线程安全线程安全与cpu资源的抢夺 多线程在读写共享变量时引发的问题 线程的原子...

  • 内存模型

    1.4 Java的 内存模型 是否线程安全线程安全与cpu资源的抢夺多线程在读写共享变量时引发的问题 线程的原子性...

  • 并发编程有关知识点(五)

    Java 内存模型 java线程安全总结 深入理解java内存模型系列文章 线程状态: 一张图让你看懂JAVA线程...

  • Java内存模型与线程安全

    java的内存模型可以用一张图概括: 首先 导致共享变量在线程间不可见的原因:1.线程的交叉执行2.重排序(编译器...

  • Java内存模型与线程安全

    参考: 《深入理解Java虚拟机》第四版——周志明 再有人问你Java内存模型是什么,就把这篇文章发给他 由于CP...

  • 第12章 Java内存模型与线程

    第12章 Java内存模型与线程 12.3Java内存模型 Java内存模型 [1](Java Memory Mo...

网友评论

      本文标题:JAVA-内存模型与线程安全

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