前言

可跟《主存存取和磁盘存取原理笔记》串着看

https://blog.csdn.net/suifeng3051/article/details/52611310

杂技

Java 内存模型(堆栈)

Jvm 内部,Java 内存模型把内存分成了两个部分:线程栈区和堆区:

栈区包含:线程执行信息(线程栈),本地原始类型变量(boolean,byte, short, int, long, float, double)
堆区包含:Java 应用创建的所有对象信息,基础类型的封装类

  1. 一个本地变量如果是原始类型,存储栈中
  2. 一个本地变量是一个对象的引用,那么这个本地引用存储栈,对象本身存储堆中
  3. 一个对象的成员方法,存储栈中,方法中包含的原始类型变量,存储堆中
  4. 一个对象的成员变量,无论是原始类型还是包装类型,都存储堆中
  5. 堆中数据可被多个线程共享,对于原始类型变量,每个线程都会拷贝一份

硬件内存架构

不管什么内存模型,最终还是运行在计算机硬件上,因此有必要了解计算机硬件的内存架构

  1. 现在计算机一般都有2个以上cpu, 每个cpu还有多个核心,线程会在各个cpu核心中并行运行
  2. CPU 内部会有一组CPU 寄存器、CPU 缓存(一级,二级,三级缓存),RAM主存
  3. 存储速度: CPU 寄存器 > CPU 缓存(一级> 二级> 三级) > RAM
  4. 存储大小 CPU 寄存器(64 bit) < CPU 缓存[一级(64k)> 二级(256k)> 三级(8MB)] < RAM(4G)

线程间的竞争现象

  1. 存在 count 为1, 两个线程都在缓存中保存一份备份
  2. 两个线程分别改变 count 的值,存在写缓存,顾缓存和 RAM的值存在偏差
  3. 当写缓存的数据 flush 到 RAM 就发生冲突了

内存屏障(Memory Barrier):

  1. 内存屏障,又称内存栅栏,是一个CPU 指令
  2. 保证特定操作的执行顺序。编译器和CPU会重排序指令,为了优化,插入内存屏障指令会让CPU不把这条指令重排序。
  3. 影响某些数据(或某条指令的执行结果)的内存可见性。强制刷新各种CPU cache, 写缓存的数据直接写入RAM,读缓存重新读取数据

内存屏障和 Java 有什么关系?

volatile 是基于 Memory Barrier 实现的。

这意味着,如果写入一个 volatile 变量a,可以保证:

  1. 一个线程写入变量a 后,任何线程访问该变量都会拿到最新值
  2. 由于会刷新 Cache中所有先前写入,因此写入变量a之前的写入操作,其更新的数据对于其它线程也是可见的

最新文章

  1. XML文件(2)--使用DOM4J示例
  2. 最长回文子串(Longest Palindromic Substring)
  3. excel导出字符串
  4. HDU 4753 Fishhead’s Little Game(DFS)
  5. tomcat 大并发报错 Maximum number of threads (200) created for connector with address null and port 8080
  6. 《BI那点儿事》SQL Server 2008体系架构
  7. 曲率已驱动了头发——深度分析谷歌AlphaGo击败职业棋手
  8. Delphi与C语言类型转换对照
  9. Android控件之ToggleButton(多状态按钮)
  10. Puppet学习:pp文件权限问题
  11. Python之日期与时间处理模块(date和datetime)
  12. 初入angular4——实际项目搭建总结
  13. Liunx-常用命令的总结(5)
  14. C语言之运算符、表达式和语句
  15. Visual Studio 代码快捷键
  16. 关于EasyUI datagrid 无法在dialog中显示的问题分析及解决方案!
  17. Linux 下 mysql的基本配置
  18. 【DM】The PageRank Citation Ranking: Bringing Order to the Web - PageRank引用排名:将订单带到Web上
  19. http和socket之长连接和短连接区别(转)
  20. Nutch2.2.1,window,eclipse,安装

热门文章

  1. 机器学习基石笔记:03 Types of Learning
  2. aaa配置(第十三组)
  3. 使用 pandas 导出数据
  4. mysql 开发进阶篇系列 14 锁问题(避免死锁,死锁查看分析)
  5. sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)
  6. salesforce零基础学习(九十二)使用Ant Migration Tool 实现Metadata迁移
  7. Windows编程之模块遍历(C++实现)
  8. Python3获取拉勾网招聘信息
  9. Java——对象比较
  10. Hive基础之Hive数据类型