Java 内存模型

来源:互联网 发布:底层软件开发工程师 编辑:程序博客网 时间:2024/05/16 02:30

1、内存分类

A、主内存(可以理解为内存条)

B、线程的工作内存

C、处理器的高速缓存


方法的参数、局部变量,仅仅保存在线程的工作内存中。使用的对象变量,也是主内存对象的副本。不同的线程之间的工作内存 不能直接访问。线程之间的变量,必须传递到朱内存中,才能完成数据传递。


2、内存操作

此处说得操作,设计到主内存、线程工作内存

A、lock(锁) 概念适用于主内存,表示对一个资源进行标示,表示该资源已被某线程占有,其他线程咱不能获取该资源

B、ublock(释放锁) 概念作用于主内存。表示释放一个之前线程占有的资源。只有释放之后,资源才能被其他线程占有

C、read(读) 概念作用于主内存。 当线程用到一个变量时(比如成员变量),因为线程对变量的操作在工作内存,所以先从主内存读取变量的值。

D、load(装载)概念作用于工作内存。线程将从主内存读取的值(上一步read的内容),装载到工作内存中,以便于工作内存使用。

E、use(使用)概念作用与工作内存。每当线程执行引擎遇到使用一个变量值时,完成该操作。

F、assign(复制)概念作用与工作内存。线程工作内存中,执行引擎遇到变量赋值时,完成该操作。

E、store (存储) 概念作用于工作内存。 线程将工作内存中的变量副本,存储到工作内存。

F、write(写) 概念作用于主内存。表示主内存将变量的值,写入到主内存的变量地址中。


3、条件约束

A、read以及load、store以及write 必须成对出现

B、工作内存中变量值改变时,必须同步到主内存中

C、lock、unlock必须成对出现

D、主内存资源被线程lock之后,使用的时候,工作内存中资源内容被清空,使用的时候,重新从主内存中读取内容。

E、一个资源在被unlock之前,必须将工作内存中资源同步到主内存中,之后执行unlock


4、线程安全

A、volatile 
一个变量在被声明为volatile类型时,线程在本地内存中使用这个变量的use环节时,直接触发read、load操作,从主内存中读取变量内容。即使用本地内存中的变量的值
当线程对volatile变量执行assign操作时,直接触发store、write操作,将数据同步到主内存。并置其它线程的副本为无效。volatile变量的写操作,可以被其他线程的读操作看到。
B、synchronized
一个方法或者一段代码被声明synchronized的时候,表示该段指令仅被一个线程执行。执行完成的时候,退出之前(释放锁之前),将工作内存中的变量内容刷新到主内存中。

C、final关键字

被final关键字修饰的变量,不能改变其值。当final修饰的是一个对象或者数组时,指向的内存区域不变,但是内容或者数组元素可变。


0 0
原创粉丝点击