• 【Java并发编程七】Java内存模型


    JMM内存模型

     JVM定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。JMM调用栈和本地变量存放在线程栈上,对象存放在堆上。

    操作可见性

     线程间通信必须要经过主内存。如果线程A与线程B之间要通信的话,必须要经历下面2个步骤:
     1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。
     2)线程B到主内存中去读取线程A之前已更新过的共享变量。

     线程对共享变量修改的可见性。当一个线程修改了共享变量的值,其他线程能够立刻得知这个修改。可以通过以下方式实现:

    • Java中的volatile关键字:volatile关键字可以保证直接从主存中读取一个变量,如果这个变量被修改后,总是会被写回到主存中去。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是volatile变量都是如此,普通变量与volatile变量的区别是:volatile的特殊规则保证了新值能立即同步到主内存,以及每个线程在每次使用volatile变量前都立即从主内存刷新。因此我们可以说volatile保证了多线程操作时变量的可见性,而普通变量则不能保证这一点。
    • Java中的synchronized关键字:同步快的可见性是由“如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值”、“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这两条规则获得的。
    • Java中的final关键字:final关键字的可见性是指,被final修饰的字段在构造器中一旦被初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那么在其他线程就能看见final字段的值(无须同步)

    synchronized与volatile的区别

     synchronized可以实现操作的一致性。

  • 相关阅读:
    第六章 Matlab的复数数据、字符数据和附加画图类型
    使用 Filebeat+Easysearch+Console 打造日志管理平台
    GAN相关网络用什么归一化方法:BatchNorm?Weight Norm?Layer Norm?
    Reactive 判断的API(逻辑判断)
    Nacos服务注册与发现
    有关多线程环境下的Volatile、lock、Interlocked和Synchronized们
    yolov8中train.py、val.py、predict.py的区别,什么时候该用哪个?
    分页存储逻辑地址转物理地址
    入耳式无线蓝牙耳机哪款好?入耳式音质好的蓝牙耳机推荐
    Linux——线程练习
  • 原文地址:https://blog.csdn.net/qq_45722630/article/details/134496371