Java内存模型
程序员文章站
2022-04-04 15:01:08
1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系。在讨论Jav ......
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开始使用的新的内存模型
- 规定了所有变量都存储在主存中
- 每条线程有自己的工作内存,线程工作内存中保存了该线程使用到的变量拷贝,
- 线程对变量的所有操作都必须在工作内存中进行,不能直接读写主存.
- 线程间变量的传递均需要自己的工作内存和主存之间进行数据同步.
- 线程->本地内存->JMM->主存
happens before(保证多线程可见性的机制)
JDK5开始,Java使用新的JSR-133内存模型,使用happens before的概念来阐述操作之间的内存可见性
在 JMM 中,如果一个操作的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系
- 程序次序规则: 一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
- 锁定规则: 一个unLock操作先行发生于后面对同一个锁unlock操作
- volatile变量规则: 对一个变量的写操作先行发生于后面对这个变量的读操作
- 传递规则: 如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
- 线程启动规则: Thread对象的start()方法先行发生于此线程的每个一个动作
- 线程中断规则: 对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
- 线程终结规则: 线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束,Thread.isAlive()的返回值手段检测到线程已经终止执行
- 对象终结规则: 一个对象的初始化完成先行发生于他的finalize()方法的开始
并发需要保证原子性,可见性,有序性
线程的原子性可见性有序性:https://blog.csdn.net/qq_41806966/article/details/103393221
本文地址:https://blog.csdn.net/qq_41806966/article/details/107392747