zoukankan      html  css  js  c++  java
  • java线程内存模型JMM

    java线程内存模型的8种操作:

      read(读取):从主存中读取数据

      load(加载):将从主存中读取的数据加载到内存工作

      use(使用):使用工作内存中的数

      assign(赋值):如果某个线程对共享变量做出了改变,将数据从新写入工作区

      store():将改变后的工作区的数据重新写回主内存中

      write(写):给主内存中的变量重新赋新值。

      lock(加锁):

      unlock(解锁):

    解决jvm缓存不一致的问题:

      总线加锁:性能低,因为通过总线加锁机制,最终会把多核cpu并行执行弄成串行执行,由于lock和unlock

      MESI缓存一致协议:多个cpu从主存读取回一个数据到各自的高速缓存中,当某个线程对数据做出改变时,立马同步会主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效,MESI缓存一致协议只会在回写到主存的时候加lock锁,粒度非常小。

      

    由于在线程中使用变量时,每个线程各自都会有变量的副本,所以,当一个线程中的数据改变之后,另一个线程不知道数据变换了,而Volatile可以解决数据的可见性

    并发三大特性可见性,原子性,有序性

    Volatile:底层是通过汇编语言的前缀指令lock实现的,解决了多线程之间共享变量的可见性,単并不保证原子性,volatile会降低程序的执行效率,不能代替Synchronized

  • 相关阅读:
    7月15日考试 题解(链表+状压DP+思维题)
    暑假集训日记
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    JavaSE 基础 第42节 局部内部类
    JavaSE 基础 第41节 匿名内部类
    JavaSE 基础 第40节 内部类概述
    JavaSE 基础 第39节 接口的应用
    JavaSE 基础 第38节 接口的实现
    JavaSE 基础 第37节 接口概述
    JavaSE 基础 第36节 抽象类概述与使用
  • 原文地址:https://www.cnblogs.com/xp0813/p/11222656.html
Copyright © 2011-2022 走看看