java内存模型---学习笔记
主内存和工作内存
Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存。
线程、主内存、工作内存三者的交互关系:
内存间交互操作:
- lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占的状态
- unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
- read(读取):作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
- use(使用):作用于工作内存的变量,把工作内存中一个变量的值传递给执行引擎
- assign(赋值):作用于工作内存的变量,把一个从执行引擎接受到的值赋给工作内存的变量
- store(存储):作用于工作内存的变量,把工作内存中一个变量的值传送到主内存中
- write(写入):作用于主内存的变量,把store操作从工作内存得到的变量的值放入主内存的变量中
内存交互操作:
原子性、可见性
原子性:由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store、write,基本数据类型的访问读写是具备原子性的(long和double是例外)。synchronized使用了lock和unlock操作,所以synchronized块之间的操作也具有原子性。
可见性:可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。无论是普通变量还是volatile变量都是如此,区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。synchronized和final也能够实现可见性。
java内存模型---学习笔记相关推荐
- java 内存模型 ——学习笔记
一.Java 内存模型 java内存模型把 Java 虚拟机内部划分为线程栈和堆 下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上. ==>> 一个局部变量可能是 ...
- 解释 i = i++为什么等于本身的问题——JVM内存模型学习笔记
前段时间在扫题的时遇到类似以下的例子: public class Test {public static void main(String [] args) {int i = 1 ;//int j = ...
- 深入Java虚拟机-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- 马士兵 java内存_学习笔记-马士兵java-JAVA的面向对象与内存解析
1. 类的定义:成员变量.方法 ① 声明成员变量格式:[] type [=defaultValue]; (例:private int id;) ② 声明方法格式:[]([argu_list]){ [] ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]
文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...
- 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)
目录 0. 前提 1. 基础 1.1 并发编程的模型分类 1.1.1 通信 1.1.2 同步 1.2 JAVA 内存模型的抽象 2. 重排序 2.1 处理器重排序 2.2 内存屏障指令 2.3 HAP ...
- JVM学习-Java内存模型JMM
目录 1.Java内存模型概述 2.原子性 2.1.问题提出 2.2.问题分析 2.3.解决办法 3.原子性 3.1.退不出的循环 3.2 解决方法 3.3 可见性 4.有序性 4.1.诡异的结果 4 ...
- Java内存模型(JMM)学习总结
首先介绍两个名词:1)可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.2)共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java线程之间的 ...
最新文章
- 深度解析神经网络中每个神经元的使命 | MIT朱俊彦港中文周博磊力作
- 关于多线程Thread.Stop()破坏原子性
- android编译.a文件,Android 7.1源码编译导入AS完整教程
- 011_JavaScript数据类型
- sqlite3API函数
- jQuery找兄弟系列next(),nextAll(),nextUntil(),prev(),prevAll(),prevUntil(),siblings()
- 从零开始数据科学与机器学习算法-学习向量量化(Learning_Vector_Quantization)-08
- SpringCloud学习笔记:服务注册与发现Eureka(2)
- SpringMVC项目 使用IDEA快速构建
- 开源供应链金融_成为开源供应链
- restapi如何传图片_如何设计restful风格接口
- 箭头函数的this指向谁_你好,我是 JavaScript 的 this
- python 模块zlib 压缩与解压
- 2022爱分析·国央企数字化实践报告
- 神器推荐:应用之星,零代码就能制作炫酷的H5页面
- 性能测试指南 | 一些实用的排查命令(未完待续)
- Python优势和用途--perfect!
- elementUI Form中 勾选框设置必选不提示问题
- 「SequoiaDB巨杉数据库」Oma()概述2
- DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)
热门文章
- python get setdefault_python 字典 setdefault()和get()方法比较详解
- vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
- The server time zone value ‘XXXXXX’ is unrecognized or represents more than one time zone
- Ajax入门总结--jquery实现Ajax
- Java爬虫抓取网页
- mysql无法导入函数和存储过程解决方法
- WebApi项目创建CURD
- 自定义注解的spring注入问题
- 在centos7上安装Jenkins
- linux 双网卡绑定(bonding)实现负载均衡或故障转移