JMM

JMM(java内存模型)是一种规范,规范了java虚拟机和内存之间是如何协同工作的。
JMM是干什么的?
规定了一个线程如何,并且何时看到其他线程修改过的共享变量的值。并且在必须时,如何同步的访问共享变量。
在这里插入图片描述
Heap(堆)
java运行时数据区,有垃圾回收来负责的。
优点
可以动态的分配内存的大小,生存期也不必提前告诉编译器。 是在运行时动态分配内存的,java的垃圾收集器会自动收走这些不再使用的数据。
缺点
由于要在运行时动态分配内存,所以数据的读取速度要慢一些。
Stack(栈)
栈中一般存放一些基本类型的变量,int,byte,对象句柄等。
优点:
数据的存取速度快,优于堆,仅次于寄存器。
栈中的数据可以共享。
缺点:
栈中的数据大小与生存期必须是确定的,缺乏一些灵活性。

JMM要求调用栈本地变量存放在线程栈
对象存放在上。
一个本地变量(局部变量)也可能是指向一个对象的引用,这个对象引用存放在线程栈上,但是对象本身存放在堆上。
一个对象可能会包含方法,方法可能包含本地变量,这些本地变量还是存放在线程栈上的。这些方法所属的对象存放在堆上。
一个对象的成员变量可能会随着对象存放在堆上,不管这个对象是引用类型还是基本类型。
静态成员变量跟随类的定义存放在堆上。
堆上的对象可以被所持有该对象引用的线程所调用。
当一个线程可以访问一个对象时,该线程也可以访问该对象的成员变量。
若两个线程同时调用同一个对象上的同一个方法,他们会都访问这个对象的成员变量,此时这两个线程均拥有了该成员变量的私有拷贝。

java内存模型和硬件架构的关联
在这里插入图片描述
线程和主内存之间的关系
在这里插入图片描述
线程之间的共享变量存储在主内存中。
每个线程都有一个本地内存(并不是真是存在的,是JMM的一个抽象概念,包含了缓存,写缓冲区,寄存器,编译器优化),本地内存中包括了共享变量的本地副本。

JMM的八种同步操作
在这里插入图片描述
在这里插入图片描述
同步规则
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 比较重要的几条规则总结
  • 1:不允许线程忽略其最近的assign操作(变量在工作内存中改变了,则必须写回到主内存中)
  • 2:对一个变量进行lock后,则作废工作内存中该变量的值。(若此时工作引擎要用该变量,则必须从assign或者load该变量)
  • 3:对一个变量进行unlock后,则强制将工作内存中的变量写回到主存中(load和write)
  • 4:对一个变量进行store和use之前,必需进行了load或者assign
    在这里插入图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值