【java多线程】java的内存模型
2018-01-14 13:35
369 查看
Java内存模型
下面是我从百度上引入的一张具有代表性的图①解释:我根据这张图来解释java内存模型,从图中可以看出每个线程都需要从主内存中读取操作,这个就是java内存模型的规定之一,所有的变量存储在主内存中,每个线程都需要从主内存中获得变量的值。
然后从图中可以看到每个线程获得数据之后会放入自己的工作内存,这个就是java内存模型的规定之二,保证每个线程操作的都是从主内存拷贝的副本,也就是说线程不能直接写主内存的变量,需要把主内存的变量值读取之后放入自己的工作内存中的变量副本中,然后操作这个副本。
最后线程与线程之间无法直接访问对方工作内存中的变量。最后需要解释一下这个访问规则局限于对象实例字段,静态字段等,局部变量不包括在内,因为局部变量不存在竞争问题。
②基本执行步骤:
a、lock(锁定):在某一个线程在读取主内存的时候需要把变量锁定。
b、unlock(解锁):某一个线程读取玩变量值之后会释放锁定,别的线程就可以进入操作
c、read(读取):从主内存中读取变量的值并放入工作内存中
d、load(加载):从read操作得到的值放入工作内存变量副本中
e、use(使用):把工作内存中的一个变量值传递给执行引擎
f、assign(赋值):它把一个从执行引擎接收到的值赋值给工作内存的变量
g、store(存储):把工作内存中的一个变量的值传送到主内存中
h、write(写入):把store操作从工作内存中一个变量的值传送到主内存的变量中。
这里我再引入一张别的地方被我搜来的图供大家一起理解:
volatile关键字
在基本清除了java内存模型之后,我们开始详细说明一下volatile关键字,在concurrentHashMap之中,有很多的成员变量都是用volatile修饰的。被volatile修饰的变量有如下特性:①使得变量更新变得具有可见性,只要被volatile修饰的变量的赋值一旦变化就会通知到其他线程,如果其他线程的工作内存中存在这个同一个变量拷贝副本,那么其他线程会放弃这个副本中变量的值,重新去主内存中获取
相关文章推荐
- Java基础复习一之多线程(并发,内存模型)
- Java多线程内存模型学习
- java中多线程 内存模型和数据同步的一些要点
- jvm住内存与工作内存,内存模型反映的java多线程问题
- java 多线程内存模型
- soa---java 多线程-线程内存模型
- jvm住内存与工作内存,内存模型反映的java多线程问题
- Java多线程和内存模型(一):进程和线程基础
- java多线程之内存模型
- Java多线程中的内存模型
- 【深入分析Java多线程】(3)Java多线程之内存模型
- [Java多线程 三]---JMM内存模型
- 3.31 java多线程与内存模型
- 从java多线程内存模型说到ConcurrentHashMap
- 连咸鱼都能学会的Java多线程中的内存模型
- Java多线程内存模型
- java多线程与内存模型(一)
- java多线程-线程内存模型
- JAVA学习笔记--4.多线程编程 part1.背景知识和内存模型
- java多线程详解一线程的内存模型和线程特性