深入理解java虚拟机5——高效并发

6.1 Java内存模型

  • 缓存一致性(Cache Coherence)
  • JAVA内存模型JMM

6.2 线程

  • Java线程的实现

6.3 线程安全与锁优化

6.1.1 缓存一致性

  • 概念:在多核处理器中,每个核(处理器)有自己的高速缓存,所有高速缓存共享同一主内存
  • 存在的问题:当多个核处理主内存中的同一块区域时,会引起并发问题
  • 解决方法:缓存一致性协议,如MSI,MESI(常用),MOSI等
    • 即用协议和规则,够保证各个缓存之间和主内存之间的正确性,不会存在脏数据,不一致等问题
  • 强一致性和弱一致性
    • 强一致性:完整的顺序一致性
      • MESI协议保证了缓存的强一致性,在原理上提供了完整的顺序一致性,但是会存在效率问题
    • 弱一致性:不保证完整顺序一致性
      • 我们平时的机器会采用较为弱一些的内存模型:如允许CPU读写指令的重排序等。这些弱内存模型可以带来一定的效率提升,但是也引入了一些语义上的问题
  • Reference:https://www.cnblogs.com/zhengshuangxi/p/11180610.html

6.1.2 JAVA内存模型 Java Memory Model

  • 本地内存和主内存
    • 线程之间的共享变量存储在主内存(Main Memory)中
    • 每个线程都有一个私有的本地内存(Local Memory),本地内存是JMM的一个抽象概念,并不真实存在,它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。本地内存中存储了该线程以读/写共享变量的拷贝副本
    • 从更低的层次来说,主内存就是硬件的内存,而为了获取更好的运行速度,虚拟机及硬件系统可能会让工作内存优先存储于寄存器和高速缓存中
    • Java内存模型中的线程的工作内存(working memory)是cpu的寄存器和高速缓存的抽象描述。而JVM的静态内存储模型(JVM内存模型)只是一种对内存的物理划分而已,它只局限在内存,而且只局限在JVM的内存。
  • JMM:《java虚拟机规范》定义的一套规则,类似于缓存一致性协议
    • lock,unlock,read,load,use,assign,store,write八个指令,指令间存在规则,用于保证 主内存 和 工作内存 之间的交互不会存在问题

6.1.3 原子性/可见性/有序性

  • 见并发章节:

6.2.1 Java线程实现

  • 线程实现的方式
    • 内核线程实现(1:1实现)
    • 用户线程实现(1:N实现)
    • 用户线程加轻量级进程混合实现(N:M实现)
  • HotSpot虚拟机的实现:全部交给OS实现
    • 以HotSpot为例,它的每一个Java线程都是直接映射到一个操作系统原生线程来实现的,而且中间 没有额外的间接结构,所以HotSpot自己是不会去干涉线程调度的(可以设置线程优先级给操作系统提 供调度建议),全权交给底下的操作系统去处理,所以何时冻结或唤醒线程、该给线程分配多少处理 器执行时间、该把线程安排给哪个处理器核心去执行等,都是由操作系统完成的,也都是由操作系统 全权决定的。

猜你喜欢

转载自blog.csdn.net/qq_41157876/article/details/112605136