JVM:Java内存模型与运行时数据区域

Java内存模型(Java Memory Model, JMM)

Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)在计算机内存中存储和管理数据的一种架构,JMM定义了一套规范来保证Java程序在多线程环境下的正确性

它是Java并发编程的基础,解决了多线程环境下的共享变量的可见性、原子性和有序性问题。此处的变量(V ariables)与Java编程中所说的变量有所区别,不包括局部变量与方法参数,因为他们是线程私有的,不会被共享,不会存在竞争问题。

以下是Java内存模型的一些关键概念:

  1. 主内存(Main Memory):主内存是一块存储共享变量的内存区域,所有线程都可以访问。当一个线程修改了某个共享变量的值,这个变化会被更新到主内存中。
  2. 工作内存(Working Memory):每个线程都有自己的工作内存,用于存储该线程使用的共享变量的副本。线程对共享变量的操作是在工作内存中进行的,并不直接操作主内存中的数据。当线程需要读取共享变量时,会从主内存中复制一份数据到工作内存;当线程需要写入共享变量时,会将修改后的值从工作内存刷新回主内存。
  3. 内存操作:Java内存模型定义了8种原子操作,如下:
    • lock(锁定):将主内存中的变量复制到工作内存。
    • unlock(解锁):将工作内存中的变量刷新回主内存。
    • read(读取):从主内存中读取变量的值。
    • load(加载):将read操作读取到的值加载到工作内存。
    • use(使用):从工作内存中读取变量的值,并在执行引擎中使用。
    • assign(赋值):将执行引擎中的值赋给工作内存中的变量。
    • store(存储):将assign操作赋值后的变量值写回主内存。
    • write(写入):将store操作写回的值更新到主内存中的变量。
  4. 内存屏障(Memory Barrier):内存屏障是一种硬件指令,用于确保内存操作的有序性。根据屏障的类型,它可以防止之前或之后的读写操作被重排序。
  5. 可见性:可见性是指当一个线程修改了共享变量的值,其他线程能够立即看到这个变化。Java内存模型通过工作内存和主内存的交互来确保可见性。
  6. 原子性:原子性是指一个操作要么全部完成,要么全部不完成,且在操作过程中不会被其他线程干扰。Java内存模型通过锁机制来保证原子性。
  7. 有序性:有序性是指程序的执行顺序应该与源代码中的顺序一致。Java内存模型通过内存屏障和锁机制来保证有序性。

为了确保正确性,Java内存模型还规定了一套Happens-Before规则。如果事件A Happens-Before事件B,那么事件A的结果对事件B可见。这些规则包括:

  1. 程序顺序规则:一个线程中的操作按照程序顺序发生。
  2. 监视器锁规则:解锁操作必须发生在同一个锁的后续加锁操作之前。
  3. volatile变量规则:对一个volatile变量的写操作必须发生在后续对该变量的读操作之前。
  4. 线程启动规则:线程的start()方法必须在该线程的任何其他操作之前发生。
  5. 线程终止规则:线程的终止操作(如线程完成或调用Thread.join()方法)必须在其他线程检测到该线程已经终止之前发生。
  6. 线程中断规则:线程的中断操作必须在被中断线程检测到中断之前发生。
  7. 对象终结规则:对象的构造函数完成后,对象的finalizer方法必须在对象被垃圾回收之前发生。
  8. 传递性:如果事件A Happens-Before事件B,且事件B Happens-Before事件C,那么事件A Happens-Before事件C。

通过遵循这些规则,Java内存模型确保了多线程程序的正确性。但是,实现这些规则可能会导致一定的性能开销。因此,在实际编程中,我们需要在确保多线程安全的前提下,尽量优化程序性能。

主内存(Main Memory)与 工作内存(Working Memory)

Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。

主内存与工作内存只是一个抽象概念,主内存可以类比于物理硬件的主内存,工作内存可以类比于处理器的高速缓存。所谓主内存副本,并不是将对象完全复制一份,而是复制对象的引用、对象中某个在线程访问到的字段。

内存屏障(Memory Barrier)

内存屏障(Memory Barrier,也称内存栅栏或内存屏障指令)是一种同步原语,用于确保内存操作的顺序性和一致性。在多处理器或多核系统中ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值