首页 > 系统相关 >Java 内存模型

Java 内存模型

时间:2024-07-24 16:07:20浏览次数:8  
标签:happens Java 模型 线程 内存 JMM 操作 before

Author: ACatSmiling

Since: 2024-07-24

概念

Java 内存模型Java Memory Model,简称 JMM,是 Java 语言中定义的一组规则和规范,用于解决多线程环境下的内存可见性和有序性问题。JMM 确定了线程之间如何通过内存进行交互,并规定了变量的读取和写入操作的行为。

JMM 能干吗?

  • 通过 JMM 来实现线程的工作内存和主内存之间的抽象关系。
  • 屏蔽各个硬件平台和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致性的内存访问效果。

三大特性

内存可见性:JMM 规定了一个线程对共享变量的修改何时对另一个线程可见,在没有适当的同步机制时,线程可能会看到旧的、不一致的数据。

原子性:JMM 确保基本的读写操作是原子的(不可分割的)。

有序性:JMM 规定了程序中指令的执行顺序,编译器和处理器可能会对指令进行重排序,但 JMM 规定了哪些重排序是可见的,哪些是不可见的,以确保某些操作不会被重排序而破坏程序的正确性。

可见性规则

为了确保多线程编程中的可见性和有序性,JMM 定义了一些关键的同步原语和规则:

  1. volatile 变量
    • 对 volatile 变量的读写操作具有可见性和有序性。
    • 当一个线程修改了 volatile 变量,新的值会立即被刷新到主内存中,其他线程读取时会直接从主内存中读取。
  2. synchronized 块
    • synchronized 块可以确保进入同步块的线程对共享变量的修改对其他线程可见。
    • 每个对象都有一个监视器锁(monitor lock),线程通过获取锁来实现同步。
  3. final 变量
    • final 变量在构造函数结束后不能被修改,且在构造函数中对 final 变量的写入对其他线程可见。

happens-before 原则

happens-before 原则happens-before 关系定义了一个操作的结果对另一个操作可见的条件,可以用于确定多个操作之间的顺序性和可见性,进而确保了多线程程序中的内存一致性和正确性。通过遵循这些规则,开发者可以确保在多线程环境中读写共享变量时不会出现意外的行为。

happens-before 原则内容如下:

  1. 程序次序规则(Program Order Rule)在一个线程内,按照程序的顺序,前面的操作 happens-before 后面的操作。例如,在同一个线程中,a = 1; b = 2;,则 a = 1 happens-before b = 2。
  2. 监视器锁规则(Monitor Lock Rule)对一个锁的解锁操作 happens-before 其后的对这个锁的加锁操作。例如,线程 A 对某个对象的解锁操作 happens-before 线程 B 对同一个对象的加锁操作。
  3. volatile 变量规则(Volatile Variable Rule)对一个 volatile 变量的写操作 happens-before 后续对这个 volatile 变量的读操作。例如,线程 A 对 volatile 变量 x 的写操作 x = 1 happens-before 线程 B 对 x 的读操作 int y = x。
  4. 线程启动规则(Thread Start Rule)在主线程中对线程对象的启动操作 happens-before 启动线程中的每一个操作。例如,主线程调用 thread.start() happens-before 新线程中的任何操作。
  5. 线程中断规则(Thread Interruption Rule)对线程对象的中断操作 happens-before 被中断线程检测到中断事件的发生。例如,主线程调用 thread.interrupt() happens-before 被中断线程检测到中断(通过 Thread.interrupted() 或 Thread.isInterrupted())。
  6. 线程终止规则(Thread Termination Rule)一个线程中的所有操作 happens-before 另一个线程检测到这个线程已经终止或等待这个线程终止。例如,线程 A 中的所有操作 happens-before 主线程检测到线程 A 已终止(通过 thread.join())。
  7. 对象构造规则(Object Construction Rule)对象的构造函数的执行 happens-before 该对象的 finalize() 方法的开始。例如,某个对象的构造函数执行完毕 happens-before 该对象的 finalize() 方法开始。
  8. 传递性(Transitivity)如果 A happens-before B,且 B happens-before C,那么 A happens-before C。例如,如果 a = 1 happens-before b = 2,且 b = 2 happens-before c = 3,那么 a = 1 happens-before c = 3。

原文链接

https://github.com/ACatSmiling/zero-to-zero/blob/main/JavaLanguage/java-util-concurrent.md

标签:happens,Java,模型,线程,内存,JMM,操作,before
From: https://www.cnblogs.com/acatsmiling/p/18321101

相关文章

  • pyTorch模型调优NPU
    性能分析工具pyTorchProfiling CANNProfiling看taskduration调优手段1:使用亲和的数据类型用AMP训练  AICore不支持torch.long.Tensor类型,会自动切换AICPU,影响训练。调优手段2:优化调度耗时(融合tensor) 融合算子 昇腾要求输入tensor连续,所以进行非连续内存转......
  • java8interface的新特性:default,static,funcation
    default:默认方法在类接口中可以直接定义的方法,实现接口的类可以直接使用使用案例:publicinterfaceMyInterface{defaultvoiddisplay(){System.out.println("Thisisdefaultmethod.");}}说明:被default修饰的方法可以不被子类实现。即在......
  • 1.2.3_1 OSI参考模型&TCP/IP模型
    一、术语二、常见网络设备的功能层次    对于OSI模型,主机实现了第17层的全部,集线器实现了第1层,交换机实现了第12层,路由器实现了第1~3层。1、物理层    物理层的任务是实现相邻节点之间比特(0或1)的传输。需要定义电路接口的参数(如:形状、尺寸、引脚数等)。需要......
  • 基于RFM的航空公司客户价值分析模型
    一、背景面对激烈的市场竞争,各个航空公司都推出了更优惠的营销方式来吸引更多的客户,国内某航空公司面临着客户流失、竞争力下降和航空资源未充分利用等经营危机。通过建立合理的客户价值评估模型,对客户进行分群,分析比较不同客户群的客户价值,并制定相应的营销策略,对不同的客户群提......
  • Jenkins下配置java的静态代码检测:findbugs、pmd及checkstyle实现代码自动检测
    一、插件介绍工具目的检查项FindBugs检查.class基于BugPatterns概念,查找javabytecode(.class文件)中的潜在bug主要检查bytecode中的bugpatterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等Duplicatecode帮助开......
  • Android MVP模型的学习与使用
    一、MVP(Model-View-Presenter)概叙MVP(Model-View-Presenter)是一种用于Android应用程序开发的架构模式,旨在将应用程序的不同部分分离,以提高代码的可维护性和可测试性。MVP模型包含三个主要组成部分:Model、View和Presenter。Model(模型):​ Model负责处理应用程序的数据和业务逻......
  • Java基础编程500题——综合练习
    ......
  • 记一次Echart 内存泄露问题排查
    最近发现一个web项目总是莫名其妙的内存增长,然后进行定位后来发现问题大概率出在Eharts上。于是乎就开始搜索关于echarts内存增长的一些例子,但是都没有结果。其中翻博客时发现甚至有人换成一维数组就问题就解决了,当然这个试过之后对我来说解决不了问题。(这样能解决掉也真是离......
  • 数据结构(Java):Map集合&Set集合&哈希表
    目录1、介绍1.1 Map和Set1.2模型2、Map集合2.1Map集合说明2.2 Map.Entry<K,V>2.3Map常用方法2.4Map注意事项及实现类 3、Set集合3.1Set集合说明 3.2 Set常用方法 3.3Set注意事项及其实现类4、TreeMap&TreeSet4.1集合类TreeMap(Key-Value模型)4.1.1底......
  • 几个适合Java开发者的免费IDEA插件
    今天,给大家推荐几个好用且免费的IntelliJIDEA插件。如果你还没有用过,可以尝试一下,也许对你的日常工作会有一定的效率提升噢!RestFulTool如果你是一个RESTful服务的开发者,那么这个一定要试一下。它是一套非常丰富的RESTful服务开发工具,对SpringMVC和SpringBoot支持也是......