• 【java多线程】java的内存模型


    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修饰的变量的赋值一旦变化就会通知到其他线程,如果其他线程的工作内存中存在这个同一个变量拷贝副本,那么其他线程会放弃这个副本中变量的值,重新去主内存中获取

  • 相关阅读:
    REST framework框架的基本组件
    GIT如何根据历史记录回退代码
    如何查看磁盘存储空间
    git免密拉取代码
    windows好用的cmd命令
    git如何新建分支
    screen命令
    解决windows配置visual studio code调试golang环境问题
    转载一篇棒棒的AWK教程
    解决Creating Server TCP listening socket 54.179.160.162:7001: bind: Cannot assign requested address
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/8283189.html
Copyright © 2020-2023  润新知