主内存和工作内存
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内存模型---学习笔记相关推荐

  1. java 内存模型 ——学习笔记

    一.Java 内存模型 java内存模型把 Java 虚拟机内部划分为线程栈和堆 下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上.      ==>>  一个局部变量可能是 ...

  2. 解释 i = i++为什么等于本身的问题——JVM内存模型学习笔记

    前段时间在扫题的时遇到类似以下的例子: public class Test {public static void main(String [] args) {int i = 1 ;//int j = ...

  3. 深入Java虚拟机-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

  4. 马士兵 java内存_学习笔记-马士兵java-JAVA的面向对象与内存解析

    1. 类的定义:成员变量.方法 ① 声明成员变量格式:[] type [=defaultValue]; (例:private int id;) ② 声明方法格式:[]([argu_list]){ [] ...

  5. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  6. 重点知识学习(8.2)--[JMM(Java内存模型),并发编程的可见性\原子性\有序性,volatile 关键字,保持原子性,CAS思想]

    文章目录 1.JMM(Java Memory Model) 2.并发编程的可见性 3.并发编程的有序性 4.并发编程的原子性 5.volatile 关键字 6.保持原子性: 加锁,JUC原子类 加锁 ...

  7. 《深入理解 Java 内存模型》读书笔记(上)(干货,万字长文)

    目录 0. 前提 1. 基础 1.1 并发编程的模型分类 1.1.1 通信 1.1.2 同步 1.2 JAVA 内存模型的抽象 2. 重排序 2.1 处理器重排序 2.2 内存屏障指令 2.3 HAP ...

  8. JVM学习-Java内存模型JMM

    目录 1.Java内存模型概述 2.原子性 2.1.问题提出 2.2.问题分析 2.3.解决办法 3.原子性 3.1.退不出的循环 3.2 解决方法 3.3 可见性 4.有序性 4.1.诡异的结果 4 ...

  9. Java内存模型(JMM)学习总结

    首先介绍两个名词:1)可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到.2)共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java线程之间的 ...

最新文章

  1. 深度解析神经网络中每个神经元的使命 | MIT朱俊彦港中文周博磊力作
  2. 关于多线程Thread.Stop()破坏原子性
  3. android编译.a文件,Android 7.1源码编译导入AS完整教程
  4. 011_JavaScript数据类型
  5. sqlite3API函数
  6. jQuery找兄弟系列next(),nextAll(),nextUntil(),prev(),prevAll(),prevUntil(),siblings()
  7. 从零开始数据科学与机器学习算法-学习向量量化(Learning_Vector_Quantization)-08
  8. SpringCloud学习笔记:服务注册与发现Eureka(2)
  9. SpringMVC项目 使用IDEA快速构建
  10. 开源供应链金融_成为开源供应链
  11. restapi如何传图片_如何设计restful风格接口
  12. 箭头函数的this指向谁_你好,我是 JavaScript 的 this
  13. python 模块zlib 压缩与解压
  14. 2022爱分析·国央企数字化实践报告
  15. 神器推荐:应用之星,零代码就能制作炫酷的H5页面
  16. 性能测试指南 | 一些实用的排查命令(未完待续)
  17. Python优势和用途--perfect!
  18. elementUI Form中 勾选框设置必选不提示问题
  19. 「SequoiaDB巨杉数据库」Oma()概述2
  20. DHU数据结构-单链表-ADT应用-长整数加法运算(使用单链表存储计算结果)

热门文章

  1. python get setdefault_python 字典 setdefault()和get()方法比较详解
  2. vb检测电脑温度_电脑硬件温度多少正常?如何查看电脑硬件温度?
  3. The server time zone value ‘XXXXXX’ is unrecognized or represents more than one time zone
  4. Ajax入门总结--jquery实现Ajax
  5. Java爬虫抓取网页
  6. mysql无法导入函数和存储过程解决方法
  7. WebApi项目创建CURD
  8. 自定义注解的spring注入问题
  9. 在centos7上安装Jenkins
  10. linux 双网卡绑定(bonding)实现负载均衡或故障转移