7.2笔记(java的内存模型)
java的内存模型:
概念:定义了java程序中各个变量的访问,即在虚拟机中把java变量存到内存中以及如何从内存中取出变量的底层细节。
- java内存模型规定了所有变量都存到主存上,每个线程都有自己的工作内存。线程在工作内存上保存了该线程使用变量的副本,线程只能在自己的工作内存上进行读取,赋值等操作,不能直接读写主存的变量。线程之间无法做到值传递,只有通过把值传给主存,其他线程才能从主存中进行读取变量。
主存和工作内存的操作类型:只需要保证顺序执行即可,不必连续执行
- lock(锁定):把一个变量指定为某个线程的独占状态
- unlock(解锁):解除变量的锁定状态,解锁后才能被其他线程锁定
- read(读取):把主存的变量存储到线程自己的工作内存中
- load(载入):read之后的操作,把主存读到的变量放入到工作内存的副本中
- use(使用):把工作内存的变量传递给执行引擎,当出现使用使用变量的字节码指令时就执行这个操作
- assign(赋值):把执行引擎的值传到工作内存,当jvm遇到赋值的字节码指令时就执行这个操作
- store(存储):把工作内存的变量送到主内存中
- write(写入):在主内存中执行,把从工作内存中的变量的值传送到主存的变量中
指令重排:
概念:在执行程序时为了提高性能,编译器和处理器会对指令进行重新排序
- 编译器优化的重排序。在不改变语义的条件下,可以重新安排语句的执行顺序。
- 指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
- 内存系统的重排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

浙公网安备 33010602011771号