美文网首页
JMM内存分析

JMM内存分析

作者: CoderInsight | 来源:发表于2023-10-12 14:38 被阅读0次

Java的内存模型,实际上就是JMM(Java Memory Model),它描述了一系列的规则或者是规范,用来解决多线程的共享变量问题,比如 volatilesynchronized等关键字。

面试经历:JMM内存 -> 三个关键词 -> 并发编程

(1),JMM的结构

JMM 分为主存储器Main Memory)和工作存储器Working Memory)两种。

  • 主存储器是实例位置所在的区域,所有的实例都存在于主存储器内。比如,实例所拥有的字段即位于主存储器内,主存储器是所有的线程所共享的。
  • 工作存储器是线程所拥有的作业区,每个线程都有其专用的工作存储器。工作存储器存有主存储器中必要部分的拷贝,称之为工作拷贝(Working Copy)。

在这个模型中,线程无法对主存储器直接进行操作。如果两个不同的线程通信,如线程 A 想要和线程 B 通信,只能通过主存进行交换。 => 正是因为这个设计,需要一些原子操作(Action)来控制主存和工作内存的交互。

(2),三大特性

1),原子性

JMM 保证了 read、load、assign、use、store 和 write六个操作具有原子性,对其他基本数据类型所对应的内存单元的访问读写都是原子的。

  • (1),LongDouble类型比较特殊,在64位系统中是可以可以保证原子性的,但是在32位的系统中,对64位的数据读写就需要多条指令来完成,所以不具备原子性。
  • (2),为了保证longdouble类型的原子性
    • 使用synchronized关键字或Lock对象来实现线程间的同步,确保对longdouble类型的读写操作是原子的。
    • 使用AtomicLong、AtomicDouble等原子类,这些类提供了针对longdouble类型的原子操作方法,可以确保读写操作的原子性。
    • 使用volatile关键字来修饰longdouble类型的变量,可以保证可见性,即一个线程对变量的修改对其他线程是可见的。对于原子性的实现表述:volatile可以保证对变量的单个读写操作的原子性,但无法保证多个操作的原子性。如果需要进行复合操作,比如一个由多个读写操作组成的原子操作,仍然需要使用synchronized关键字或者java.util.concurrent.atomic包中提供的原子类来实现线程安全。
自用-常用分析图-JMM内存原子操作梳理.drawio.png

原子操作的具体实现

  1. Read(读取):作用于主内存,负责将主内存中数据传入到线程的工作内存中。
  2. Load(载入):作用于工作内存,把Read操作的值读入到工作内存的变量副本中。
  3. Store(存储):作用于工作内存,负责将工作内存的一个变量传入到主内存中。
  4. Write(写入):作用于主内存,把Store传入的值写入到主内存的变量。
  5. Use(使用):作用于工作内存,当虚拟机中有使用到这个变量的时候,会调用该指令,即负责将工作内存的值传递给执行引擎。
  6. Assign(赋值):作用于工作内存,负责将执行引擎传入的变量赋值给工作内存的变量。
  7. Lock(锁定):作用于主内存,把变量标记为线程独占状态。
  8. Unlock(解锁):作用于主内存,负责释放独占状态。

2),可见性

可见性是指当一个线程修改了共享变量的值,其他线程也能立即感知到这种变化。volatile、synchronized、final 和锁,都是保证可见性的方式。

  1. volatile 关键字的变量,每当变量的值有变动时,都会把更改立即同步到主内存中;而如果某个线程想要使用这个变量,则先要从主存中刷新到工作内存上,这样就确保了变量的可见性。
  2. 锁和同步关键字就比较好理解一些,它是把更多个操作强制转化为原子化的过程。由于只有一把锁,变量的可见性就更容易保证。 => 即通过原子化来避免其他的线程获取,从而保证变量的可见性只会是自己。

3),有序性

指令重排序是 JVM 为了优化指令,来提高程序运行效率的,在不影响单线程程序执行结果的前提下,按照一定的规则进行指令优化,从而会表现出“无序性”。而通过添加上volatile关键字,禁止重排序,可以确保程序的“有序性”。

(3),内存屏障

内存屏障(Memory Barrier)的作用是在特定的条件下的重排序和内存可见性问题。Java编译器在生成字节码的时候,会在执行指令序列的适当位置插入内存屏障来限制处理的重排序。

参考连接

  1. 大厂面试题:不要搞混 JMM 与 JVM

相关文章

网友评论

      本文标题:JMM内存分析

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