Java-100天知识进阶-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内存模型分为: 主内存,工作内存
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累。不占太多时间,不停的来唤醒你记忆深处的知识点。
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.1 主内存
1.2 工作内存
二、线程安全特性
2.1 原子性
2.2 可见性
2.3 有序性
三、指令重排理解
3.1 指令重排分几种
3.2 核心点
两个线程之间在执行同一段代码之间的critical area,在不同的线程之间共享变量;由于执行顺序、CPU编译器对于程序指令的优化等造成了不确定的执行结果。
3.3 原因
主要还是编译器以及CPU为了优化代码或者执行的效率而执行的优化操作;
3.3 防止指令重排
volatile关键字可以保证变量的可见性,因为对volatile的操作都在Main Memory中,而Main Memory是被所有线程所共享的,这里的代价就是牺牲了性能,无法利用寄存器或Cache,因为它们都不是全局的,无法保证可见性,可能产生脏读。
volatile还有一个作用就是局部阻止重排序的发生,对volatile变量的操作指令都不会被重排序,因为如果重排序,又可能产生可见性问题。
在保证可见性方面,锁(包括显式锁、对象锁)以及对原子变量的读写都可以确保变量的可见性。但是实现方式略有不同,例如同步锁保证得到锁时从内存里重新读入数据刷新缓存,释放锁时将数据写回内存以保数据可见,而volatile变量干脆都是读写内存。
本文由zshipu.com学习笔记或整理或转载,如有侵权请联系,必改之。
Java-100天知识进阶-Java内存-知识铺(四)的更多相关文章
- Java-100天知识进阶-JVM内存-知识铺(三)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. Java内存模型(JMM) JVM内存模式是JVM的内存分区 Java内存模式是一种虚 ...
- Java-100天知识进阶-基本类型-知识铺(一)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停地来唤醒你记忆深处的知识点. Java的两大数据类型: 一.内置数据类型 二.引用数据类型 内置数据类型 Java语 ...
- Java-100天知识进阶-GC种类-知识铺(六)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 一.GC回收器的 4个指标: 1.Throughput,非gc时间与总运行时间的比重. ...
- Java-100天知识进阶-GC算法-知识铺(五)
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. GC算法 1.标记清除算法 优缺点:不需要额外空间,但是遍历空间花费大,而且会产生大量 ...
- Java 从入门到进阶之路(十四)
在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...
- JVM知识(一) 求你了,别再说Java对象都是在堆内存上分配空间的了!
求你了,别再说Java对象都是在堆内存上分配空间的了! https://baijiahao.baidu.com/s?id=1661296872935371634&wfr=spider& ...
- 谈谈Java程序员进阶的那些知识和方向
谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...
- 打造高性能Java应用需掌握的5大知识
这篇文章节选自<java performance>,对java性能比较关心的同学大概都知道这本书,性能这个东西可能是很多同学在日常写java code的时候很少去关心的,但是在我们写cod ...
- Java开发知识之Java数组
Java开发知识之Java数组 一丶数组简介 首先,不管是Java 还是 C++ 还是其它语言.都有数组. (有可能叫法不同) 数组简而言之就是存储一段连续相同数据类型的数据结构 在Java中数组可以 ...
随机推荐
- docker容器虚拟化技术
简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker.Nginx.PHP.Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题 1 ...
- LeetCode刷题--两数相加(中等)
题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
- 《Web Development with Go》JWT认证
时间晚了,先来一版调通的JWT普通认证, 明天再弄一个通过中间件,及gorilla,negroni库的认证, 这样正规些, 但认证通过之后,如何对应权限? 由于jwt-go从2升到3,还有rsa 10 ...
- Tkinter使frame填充整个区域
在未设置默认情况下效果为 设置之后出现效果 使用方法: 增加 fill=X/Y/BOTH 以我为例: leftFrame.pack(side='left',fill=Y)
- PC端视频播放器
视频播放器:Potplayer 它是一款纯净的.无广告.极速
- 几行代码轻松实现PHP文件打包下载zip
<?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...
- 【linux知识】文件存储结构及物理设备命名(FHS)
FHS是文件系统层次化标准(Filesystem Hierarchy Standard). 一切从根目录 " / " 开始. Linux中常见目录及对应内容: 路径分为:绝对路径( ...
- sublime插件开发教程4
写几个简单的例子详解下 import sublime import sublime_plugin class ExampleCommand(sublime_plugin.TextCommand): d ...
- Glide生命周期原理
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/uTv44vJFFJI_l6b5YKSXYQ作者:连凌能 Android App中图片的展示是很 ...
- ETCD:基于角色的访问控制
原文地址:Role-based access control 总览 身份验证已添加到etcd 2.1中. etcd v3 API略微修改了身份验证功能的API和用户界面,以更好地适应新的数据模型.本指 ...