当前位置: 移动技术网 > IT编程>开发语言>Java > Java内存模型

Java内存模型

2018年08月23日  | 移动技术网IT编程  | 我要评论

Java内存模型(Java Memory Model)

在现代计算机中一般都有多CPU,每个CPU都有对应的寄存器,高速缓存,但是主存就一个

Java程序是运行在JVM上的,Java内存模型是一种符合模型规范,屏蔽各种硬件和操作系统的访问差异,保证了Java程序在各种平台对内存的访问都能保证效果一致的机制和规范.

如下图

因为现代计算机不止一个CPU,主存只有一个,所以出现并发问题

当程序在运行过程中,会将运算需要的数据从主存复制一份到cpu的高速缓存中,那么CPU进行计算时可以直接取和写,运算结束后,再将高速缓存中的数据刷新到主存中.

例如有一变量 i,两个线程,同样的操作,给这个i+1,线程1读取此变量到高速缓存1,这时候高速缓存中 i 的值为1,然后进行运算,i=2

然后同时,线程2也读取此变量,这个时候还没有将计算完的变量刷新到主存,所以读取到的为1,然后进行运算后,为2,这时候放回去,i就只为2,而不等于3了

 

内存模型一般指的是JDK 5开始使用的新的内存模型

  1. 规定了所有变量都存储在主存中
  2. 每条线程有自己的工作内存,线程工作内存中保存了该线程使用到的变量拷贝,
  3. 线程对变量的所有操作都必须在工作内存中进行,不能直接读写主存.
  4. 线程间变量的传递均需要自己的工作内存和主存之间进行数据同步.
  5. 线程->本地内存->JMM->主存

happens before(保证多线程可见性的机制)

    JDK5开始,Java使用新的JSR-133内存模型,使用happens before的概念来阐述操作之间的内存可见性

    在 JMM 中,如果一个操作的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系

  1. 程序次序规则: 一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  2. 锁定规则: 一个unLock操作先行发生于后面对同一个锁unlock操作
  3. volatile变量规则: 对一个变量的写操作先行发生于后面对这个变量的读操作
  4. 传递规则: 如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
  5. 线程启动规则: Thread对象的start()方法先行发生于此线程的每个一个动作
  6. 线程中断规则: 对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
  7. 线程终结规则: 线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束,Thread.isAlive()的返回值手段检测到线程已经终止执行
  8. 对象终结规则: 一个对象的初始化完成先行发生于他的finalize()方法的开始

并发需要保证原子性,可见性,有序性

线程的原子性可见性有序性:https://blog.csdn.net/qq_41806966/article/details/103393221

本文地址:https://blog.csdn.net/qq_41806966/article/details/107392747

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网