Java内存模型(JMM)

发布时间:2019-11-19 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java内存模型(JMM)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Java内存模型(JMM)

定义:JMM是一种规范,它规范了Java虚拟机与计算机内存之间是如何协同工作的,它规定了一个线程是如何和何时可以看到其它线程修改过的共享变量的值,以及如何同步共享变量的值。

clipboard.png

当一个线程可以访问这个对象的时候,他也可以访问这个对象的成员变量,如果两个线程同时调用同一个对象上的同一个方法,他们将都会访问这个对象的成员变量,但是每一个线程都拥有了这个变量的私有拷贝(变量副本)。

clipboard.png

假设主内存中变量的值为1,线程A和B同时执行。线程A从主内存中拿到的值是1,存入自己的本地内存中,然后执行+1的操作结果为2,然后将2写回主内存中。
同时线程B从主内存中拿到的值也是1,存入线程B的本地内存中+1结果也是2,写入主内存,而不是读取线程A的结果之后在进行计算,这两个线程间的数据是不可见的,因此计数就出现了错误,这个时候就需要添加一些同步手段,来保证并发时程序处理的准确性。

JMM - 线程同步的八种操作

  1. lock(锁定)

    lock:作用于主内存的变量,把一个变量标示为一条线程独占状态
  2. unlock(解锁)

    unlock:作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
  3. read(读取)

    read:作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
  4. load(载入

    load:作用于工作内存的变量,他把read操作从主内存中得到的变量值放入工作内存的变量副本中
  5. use(使用)

    use:作用于工作内存变量,把工作内存中的一个变量值传递给执行引擎
  6. assign(赋值)

    assign:作用于工作内存变量,他把一个从执行引擎接收到的值赋值给工作内存变量
  7. Store(存储)

    store:作用于工作内存变量,把工作内存中的一个变量值传递到主内存中,一边随后的写操作
  8. wrITe(写入)

    write:作用于主内存变量,他把store操作从工作内存中一个变量的值传递到主内存的变量中

线程同步规则

如果要把一个变量从主内存复制到工作内存,就需要按顺序的执行read和load操作,如果把变量从工作内存同步到主内存中,就要按顺序执行store和write操作。但是Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行

不允许read和load、store和write单独出现

不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中

不允许一个线程无原因(没有发生过任何assign操作)就把数据从工作内存同步到主内存中

一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。也就是对一个变量实施use和store操作之前,必须先执行过assign和load操作

一个变量在同一时刻只允许一条线程对其进行lock操作,但是lock操作可以被同一条线程重复执行多次,多次执行lock后,只执行相同次数的unlock操作,变量才会被解锁。lock和unlock必须成对出现

如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值

如果一个变量事先没有被lock锁定,则不允许对他执行unlock操作,也不允许去unlock一个被其他线程锁定的变量

对一个变量执行unlock操作之前,必须事先将此变量同步到主内存中(执行store和write)

过程图解

Java内存模型(JMM)

脚本宝典总结

以上是脚本宝典为你收集整理的Java内存模型(JMM)全部内容,希望文章能够帮你解决Java内存模型(JMM)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。