欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java内存模型

程序员文章站 2022-04-04 15:01:08
1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Jav ......

Java内存模型(Java Memory Model)

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

Java程序是运行在JVM上的,Java内存模型是一种符合模型规范,屏蔽各种硬件和操作系统的访问差异,保证了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

相关标签: 架构必备