您的位置:首页 > 编程语言 > Java开发

Java内存模型与线程

2012-09-27 11:34 239 查看
1、衡量一个服务器性能的高低好坏,是每秒事务处理数,它代表着一秒内服务端平均能响应的请求总数。

2、硬件中处理器、高速缓存、主内存间的交互关系



3、Java内存模型中线程、主内存、工作内存三者的交互关系



Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。

Java内存模型的主要目标是定义程序中各个变量的访问规则。

Java内存模型规定了所有的变量都存储在主内存中(虚拟机内存的一部分),每条线程还有自己的工作内存,可与前面的处理器高速缓存类比,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不用线程之间也无法直接访问对方工作内存中的变量,线程间变量的值的传递均需要通过主内存来完成。(这里的主内存、工作内存和Java运行时数据区的Java堆、栈、方法区等并不是同一层次的内存划分。如果要勉强对应起来,那从变量、主内存、工作内存的定义来看,主内存主要对应于Java堆中对象的实例数据部分,而工作内存则对应于虚拟机栈中的部分区域。从更低的层次来说,主内存就是硬件的内存,而为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中。

变量——从主存复制到工作内存(read-load)——在工作内存中对变量进行使用和赋值(use-assign)——重新写入主内存(store-write)

内存间的交互操作:(八种)

lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占的状态

unlock(解锁):作用于主内存的变量,与lock操作相反

read(读取):作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用

load(载入):作用于工作内存的变量,把read操作从主内存中得到的变量值放入工作内存的变量副本中

use(使用):作用于工作内存的变量,把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作

assign(赋值):作用于工作内存的变量,把从一个执行引擎接收到的值赋值给工作内存的变量,当虚拟机遇到一个变量的赋值的字节码指令时执行这个操作

store(存储):作用于工作内存的变量,把工作内存中的一个变量传送到主内存中,以便后面的write操作使用

write(写入):作用于主内存的变量,把store操作从工作内存中得到的变量写入主内存的变量中

Java内存模型还规定了执行上述八种基本操作必须满足:

1、read和load、store和write必须成对出现

2、一个线程用assign操作之后,必须同步到主内存

3、不允许一个线程无原因(没有发生过assign操作),就把数据同步到主内存

4、一个新的变量只能种主内存中“诞生”

5、如果对一个变量执行lock操作,将会清空工作内存中此变量的值。在执行引擎使用这个变量前,需要重新执行load操作初始化该变量的值

6、对一个变量unlock之前,必须先把此变量同步到主内存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: