Java-100天知识进阶-Java内存-知识铺(四)

知识铺 · · 919 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

1.Java内存模型是每个java程序员必须掌握理解的

2.Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节

3.Java的并发采用的是共享内存模型

4.Java内存模型:JMM(Java Memory Model)

5.JMM规定了所有的变量都存储在主内存(Main Memory)

6.每个线程还有自己的工作内存(Working Memory), 线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝

7.线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行

8.不能直接读写主内存中的变量

9.特例:volatile变量仍然有工作内存的拷贝,特殊的操作:禁止指令重排,它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行,读性能消耗与普通变量几乎相同,但是写操作稍慢。

一、JMM,Java内存模型分为: 主内存,工作内存

知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。

1.Java内存模型是每个java程序员必须掌握理解的

2.Java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存储到内存和从内存中取出变量这样的底层细节

3.Java的并发采用的是共享内存模型

4.Java内存模型:JMM(Java Memory Model)

5.JMM规定了所有的变量都存储在主内存(Main Memory)

6.每个线程还有自己的工作内存(Working Memory), 线程的工作内存中保存了该线程使用到的变量的主内存的副本拷贝

7.线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行

8.不能直接读写主内存中的变量

9.特例:volatile变量仍然有工作内存的拷贝,特殊的操作:禁止指令重排,它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行,读性能消耗与普通变量几乎相同,但是写操作稍慢。

一、JMM,Java内存模型分为: 主内存,工作内存
file

1.1 主内存
file

1.2 工作内存

file

二、线程安全特性

2.1 原子性

file

2.2 可见性

file

2.3 有序性

file

三、指令重排理解

3.1 指令重排分几种

file

3.2 核心点

 两个线程之间在执行同一段代码之间的critical area,在不同的线程之间共享变量;由于执行顺序、CPU编译器对于程序指令的优化等造成了不确定的执行结果。

3.3 原因

主要还是编译器以及CPU为了优化代码或者执行的效率而执行的优化操作;

3.3 防止指令重排

 volatile关键字可以保证变量的可见性,因为对volatile的操作都在Main Memory中,而Main Memory是被所有线程所共享的,这里的代价就是牺牲了性能,无法利用寄存器或Cache,因为它们都不是全局的,无法保证可见性,可能产生脏读。
    volatile还有一个作用就是局部阻止重排序的发生,对volatile变量的操作指令都不会被重排序,因为如果重排序,又可能产生可见性问题。
    在保证可见性方面,锁(包括显式锁、对象锁)以及对原子变量的读写都可以确保变量的可见性。但是实现方式略有不同,例如同步锁保证得到锁时从内存里重新读入数据刷新缓存,释放锁时将数据写回内存以保数据可见,而volatile变量干脆都是读写内存。

本文由zshipu.com学习笔记或整理或转载,如有侵权请联系,必改之。

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:知识铺

查看原文:Java-100天知识进阶-Java内存-知识铺(四)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

919 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传