java代码内存模型 java内存区域和内存模型
JMM内存模型
java内存模型(java memory model简称jmm) 是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规定定义
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、重庆小程序开发公司、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了渝中免费建站欢迎大家使用!
通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程都会为JVM创建一个工作内存(有些地方成为栈空间),用来存储线程私有的数据,而java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行做操,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不能的线程间无法访问对方的工作内存,线程之间的通信(传值)必须通过主内存来完成。
JMM与JVM内存区域的划分是不同的概念层次,更恰当说JMM描述的是一组规则,通过这组规则控制程序各个变量在共享数据区域和私有数据区域的访问方式, JMM是围绕原子性,有序性,可见性展开。 JMM与java内存区域唯一相似点,都存在共享区域和私有数据区域,在JMM中主内存属于共享数据区域,从某个程度上讲应该包括了堆和方法去,而工作内存数据线程私有数据区域,在JMM中主内存属于共享数据区域,从某种程度上讲应该包括了堆和方法去,而工作内存数据线成私有数据区域,从某个程度上讲泽应该包括程序计数器、虚拟机栈及本地方发栈。
主内存是由线程共享的,但是主内存不是堆。工作内存就是个抽象的东西如果在jvm里就是堆里栈里,硬件就是cpu里内存里。
比如线程a和线程b修改同一个值, 那个值就是共享变量。 他不会一直在主内存存取,他会拷贝一份到工作内存,然后线程读取工作内存中的共享变量。就算线程b中进行操作,也不会主内存直接修改,会先存在工作内存中
(1) lock(锁定) :作用于主内存的变量,把一个变量标记为一条线程独占状态
(2) unlock(解锁) :作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3) read(读取) :作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4) load(载入) :作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
(5) use(使用) :作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
(6) assign(赋值) :作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
(7) store(存储) :作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8) write(写入) :作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中
jmm是什么意思
jmm的意思就是Java内存模型(java memory model)。
因为在不同的硬件生产商和不同的操作系统下,内存的访问有一定的差异,所以会造成相同的代码运行在不同的系统上会出现各种问题。所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的并发效果。
Java内存模型规定所有的变量都存储在主内存中,包括实例变量,静态变量,但是不包括局部变量和方法参数。每个线程都有自己的工作内存,线程的工作内存保存了该线程用到的变量和主内存的副本拷贝,线程对变量的操作都在工作内存中进行。
线程不能直接读写主内存中的变量。不同的线程之间也无法访问对方工作内存中的变量。线程之间变量值的传递均需要通过主内存来完成。
整个Java内存模型实际上是围绕着三个特征建立起来的。分别是:原子性,可见性,有序性。这三个特征可谓是整个Java并发的基础。
北大青鸟设计培训:Java内存模型原理?
这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对Java内存模型体系产生一个相对清晰的理解,知其然知其所以然。
内存模型产生背景在介绍Java内存模型之前,java课程认为应该先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。
物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机的解决方案对虚拟机的实现有相当的参考意义。
物理机的并发问题硬件的效率问题计算机处理器处理绝大多数运行任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个I/O操作很难消除(无法仅靠寄存器完成所有运算任务)。
由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存完成读写操作,现代计算机系统通过加入一层读写速度尽可能接近处理器运算速度的高速缓存。
缓存作为内存和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。
缓存一致性问题基于高速缓存的存储系统交互很好的解决了处理器与内存速度的矛盾,但是也为计算机系统带来更高的复杂度,因为引入了一个新问题:缓存一致性。
在多处理器的系统中(或者单处理器多核的系统),每个处理器(每个核)都有自己的高速缓存,而它们有共享同一主内存(MainMemory)。
当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。
为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。
什么是Java内存模型?
1.java内存模型简称JMM
2.通俗点讲就是指你代码中写的那些内容在内存中是怎么存储的
3.比如说 Student stu = new Student();int a = 5; 你新建了一个学生类,建立了一个变量a,这些内容在内存中是咋存储的,
4.大的来说JMM分为堆栈,一般情况下学生类分配在堆,变量a分配在栈,
文章题目:java代码内存模型 java内存区域和内存模型
文章URL:http://pwwzsj.com/article/hhseig.html