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修饰的是一个对象或者数组时,指向的内存区域不变,但是内容或者数组元素可变。
- java内存模型 内存屏障
- Java内存模型
- Java内存模型
- java内存模型详解
- 12.Java内存模型
- java内存模型详解
- Java内存模型
- Java内存模型详解
- java 内存模型
- Java 内存模型
- Java内存模型
- java内存模型详解
- java内存模型详解
- java内存模型详解
- Java内存模型
- Java内存模型
- 浅谈java内存模型
- JAVA内存模型
- Leading and Trailing(数论基础)
- 一天一个算法: 随机洗牌算法
- spring mvc 406 (Not Acceptable)
- C# Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题
- 乐驾项目博客-2
- Java 内存模型
- Navigation View的使用
- jQ多库共存及常见插件及jq,ui
- 给鼠标右键添加选项
- UUID与获取随机验证码
- HDU5510 Bazinga
- 查找linux进程所在的目录
- This version of Android Studio is incompatible with the Gradle Plugin used.
- spring+mybatis缓存的问题及源码