美文网首页
并发编程(十一):共享模型之内存

并发编程(十一):共享模型之内存

作者: codeMover | 来源:发表于2020-04-19 15:15 被阅读0次

Java内存模型

JVM即Java Memory Model,定义了主存、工作内存抽象概念,底层对应CPU寄存器、缓存、硬件内存、CPU指令优化等。

  • 原子性:保证指令不会受到线程上下文切换的影响
  • 可见性:保证执行不会受cpu缓存的影响
  • 有序性:保证指令不会受cpu执行并行优化的影响

原子性

  • synchronized
  • ReentrenLock

可见性

  • volatile:可以修饰成员变量和静态成员变量,可以避免从自己的工作缓存中查找变量的值,必须到主存中获取变量的值,线程操作volatile变量都是直接操作内存。
  • synchronized:保证可见性
    • 保证锁对象,共享变量的修改读取放在锁的同步块内,保证可见性
  • synchronized语句块既可以保证代码块的原子性也能保证代码块内的变量可见性,但是synchronized属于重量级操作,性能相对低

有序性

JVM会在不影响正确性的前提下,可以调整语句的执行顺序

  • 现在CPU支持多级指令流水线,CPU在一个周期内,可以划分执行不同阶段指令。本质上流水线技术并不能缩短单条指令执行顺序,但是一个时间周期内可以提高执行吞吐率。
  • 在不改变程序执行结果的前提下,指令的各个阶段可以通过重排序和组合来实现指令级并行。

volatile原理

volatile的底层实现原理是内存屏障 memory barrier

  • 对volatile变量的写指令后会加入写屏障
  • 对volatile变量的读指令前会加入读屏障

可见性

  • 写屏障保证在该屏障之前的,对于共享变量的改动,都同步到主存中
  • 读屏障保证在该屏障之后,对共享变量的读取加载时的主存中的最新数据

有序性

  • 写屏障会保证指令重排时,不会将写屏障之前的代码排在写屏障之后
  • 读屏障会保证指令重排时,不会将读屏障之后的代码排在读屏障之前
  • 有序性仅仅是在同一线程有序

原子性

  • volatile不能保证原子性,仅能够保证之后读能读到最新数据,多线程不能保证原子性

hanppens-before

happens-before规定了贡献该变量的写操作对其他线程的读操作可见

  • synchronized
  • volatile
  • 在线程start之前的写,对于start后读可见
  • 线程结束之前会将工作内存的值同步到主内存中
  • 对变量默认值的写,对其他线程的读可见
  • 传递性

相关文章

  • java内存模型

    java内存模型基础 并发编程,两个关键问题:线程通信和线程同步通信机制:共享内存和消息传递 java并发采用共享...

  • 并发编程(十一):共享模型之内存

    Java内存模型 JVM即Java Memory Model,定义了主存、工作内存抽象概念,底层对应CPU寄存器、...

  • Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存...

  • java内存模型

    java内存模型的基础 并发编程模型的两个关键问题 线程之间如何通信 共享内存:线程之间共享程序的公共状态,通过写...

  • 4:Java内存模型

    1:java内存模型的基础(JMM) (1)并发编程模型的2个关键问题:共享内存和消息传递 如何理解这两个问题呢?...

  • 深入理解Java内存模型 ch1基础

    1.并发编程模型的分类 并发编程的两个关键问题: 通信 同步 通信机制有两种: 共享内存 消息传递 同步:用于控制...

  • 【并发编程】- 内存模型(针对JSR-133内存模型)篇

    并发编程模型 1.两个关键问题 1)线程之间如何通信 共享内存程之间共享程序的公共状态,通过写-读内存中的公共状态...

  • golang并发总结

    golang并发模型 go在语言层面提供了内置的并发支持 不要通过共享内存来通信,而应该通过通信来共享内存 并发与...

  • GoLang并发编程3

    并发编程有两个模式 共享内存 消息 共享内存,以C语言举例 换成 GoLang

  • Java并发(三):Java内存模型

    一. 基础 并发编程中的两个关键问题:线程间如何通信 和 线程间如何同步。 Java的并发采用共享内存模型。 1....

网友评论

      本文标题:并发编程(十一):共享模型之内存

      本文链接:https://www.haomeiwen.com/subject/mqfmbhtx.html