java内存模型---学习笔记

来源:互联网 发布:淘宝买家投诉恶意骚扰 编辑:程序博客网 时间:2024/05/29 14:46

主内存和工作内存
Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存。

线程、主内存、工作内存三者的交互关系:
这里写图片描述

内存间交互操作:

  • lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占的状态
  • unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  • read(读取):作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • use(使用):作用于工作内存的变量,把工作内存中一个变量的值传递给执行引擎
  • assign(赋值):作用于工作内存的变量,把一个从执行引擎接受到的值赋给工作内存的变量
  • store(存储):作用于工作内存的变量,把工作内存中一个变量的值传送到主内存中
  • write(写入):作用于主内存的变量,把store操作从工作内存得到的变量的值放入主内存的变量中

内存交互操作:
这里写图片描述

原子性、可见性

原子性:由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store、write,基本数据类型的访问读写是具备原子性的(long和double是例外)。synchronized使用了lock和unlock操作,所以synchronized块之间的操作也具有原子性。

可见性:可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。无论是普通变量还是volatile变量都是如此,区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。synchronized和final也能够实现可见性。

0 0
原创粉丝点击