jvm的内存模型

栏目: Java · 发布时间: 7年前

内容简介:java内存模型是符合内存模型的一种规范

为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。 通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。它与处理器有关、与缓存有关、与并发有关、与编译器也有关。他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

java 内存模型

java内存模型是符合内存模型的一种规范

JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重 排序 、处理器会对代码乱序执行等带来的问题。

  • 主内存: 计算机的物理内存 memory
  • 工作内存: 每一条线程都拥有自己的工作内存,用于保存用到的变量的主内存复本拷贝。每个线程对数据的操作,都是在工作内存中进行,不会读写主内存。

Java内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。包括synchronized和volatile等

synchronized

  • 当synchronized作用于普通方法是,锁对象是this;
  • 当synchronized作用于静态方法是,锁对象是当前类的Class对象;
  • 当synchronized作用于代码块时,锁对象是synchronized(obj)中的这个obj。

对于同步方法,JVM采用 ACC_SYNCHRONIZED 标记符来实现同步。 对于同步代码块。JVM采用 monitorenter 、 monitorexit 两个指令来实现同步。

  1. 实现原子性:
    通过 monitorenter 和 monitorexit 指令,可以保证被 synchronized 修饰的代码在同一时间只能被一个线程访问,在锁未释放之前,无法被其他线程访问到。因此,在 Java 中可以使用 synchronized 来保证方法和代码块内的操作是原子性的。当 monitorenter 后如果线程的 时间片到了 ,因为锁没有释放,所以别的线程还是不会中途插入执行当前代码,等重新轮到时间片,利用 synchronized 的可重入性,本线程还是可以继续执行,实现原子性。
  2. 可见性( 仅对synchronized锁定对象保证可见性 )
    被synchronized修饰的代码,在开始执行时会加锁,执行完成后会进行解锁。而为了保证可见性,有一条规则是这样的: 对一个变量解锁之前,必须先把此变量同步回主存中。这样解锁后,后续线程就可以访问到被修改后的值。 所以,synchronized关键字锁住的对象,其值是具有可见性的
  3. 有序性
    重排序的前提是保证单线程执行结果不能被改变, synchronized 修饰的方法或者代码块在同一时间段内只有一个线程能访问,所以可以保证执行结果不变。

以上所述就是小编给大家介绍的《jvm的内存模型》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

链接

链接

[美]艾伯特-拉斯洛•巴拉巴西 (Albert-László Barabási) / 沈华伟 / 浙江人民出版社 / 2013-8-1 / 59.90元

[内容简介] ★《链接》是《爆发》的作者,艾伯特-拉斯洛•巴拉巴西的成名之作,同时也是复杂网络的奠基之作,社交网络的入门之作。巴拉巴西之前,随机网络理论一直主导者我们的网络思维,是巴拉巴西第一个证明了,我们不是生活在随机世界里,真实网络是无尺度的。 ★巴拉巴西在书中追溯了网络的数学起源,分析了社会学家在此基础上得出的研究成果,最后提出自己的观点:我们周围的复杂网络,从鸡尾酒会、恐怖组织......一起来看看 《链接》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具