小编分享java内存模型包含什么内容。

Java内存模型(JMM)是一种抽象的概念,它描述的一组规则或者规范,定义了程序中各个变量的访问方式。JMM主要解决了多线程环境中的可见性问题,即当一个共享变量被一个线程修改后,其他线程何时能看见该变化。除了解决可见性问题,JMM还屏蔽如果是各种硬件和操作系统还有就是内存模型的内存访问差异,以实现让Java程序在各种,平台下都能达到一致效果 比如说:程序计数器这一类的硬件资源。 故其内容可概括继发性包括:定义黎明的规则、解决可见

Java内存模型(Java Memory Model,JMM)是Java虚拟机规范中定义的一个概念模型,它描述了Java程序在多线程环境下如何和何时看到其他线程写入的值,以及如何同步访问共享变量,Java内存模型规定了主内存和每个线程的本地内存之间的关系,以及它们之间的交互操作。

主内存与工作内存

Java内存模型将内存划分为两种:主内存和工作内存,所有的变量都存储在主内存中,每个线程都有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,然后再将变量写回主内存,不同的线程之间无法直接访问对方工作内存中的变量,线程间变量的传递均需要通过主内存来完成。

小编分享java内存模型包含什么内容。

内存间的交互操作

Java内存模型定义了8种操作来完成变量在主内存和工作内存之间的交互过程:

1、lock(锁定):把一个变量标识为一条线程独占的状态。

2、unlock(解锁):把一个处于锁定状态的变量释放出来,让其他线程也能访问。

3、read(读取):把一个变量的值从主内存传输到工作内存中,以便随后的load操作。

4、load(加载):把read操作从主内存中得到的变量值放入工作内存的变量副本中。

5、use(使用):把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

6、assign(赋值):把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作。

7、store(存储):把工作内存中的一个变量的值传送到主内存中,以便随后的write操作。

小编分享java内存模型包含什么内容。

8、write(写入):把store操作从工作内存中得到的变量的值放入主内存的变量中。

原子性、可见性和有序性

Java内存模型为程序员提供了以下三个保证:

1、原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

2、可见性:指当一个线程修改了一个共享变量的值,新值对于其他线程来说是可以立即得知的。

3、有序性:即程序按照代码的先后顺序执行。

先行发生原则

先行发生原则是指,如果两个操作访问同一个变量,且第一个操作为写操作,第二个操作为读操作,那么第一个操作的结果将对第二个操作产生直接影响,线程A修改了一个共享变量的值,然后线程B读取这个共享变量的值,那么线程B读取到的值将是线程A刚刚写入的值。

volatile关键字

volatile是一个类型修饰符,用于修饰被不同线程访问和修改的变量,它有以下两个特性:

1、保证此变量对所有线程的可见性,即一旦有线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。

小编分享java内存模型包含什么内容。

2、禁止进行指令重排序优化,编译器、运行时和处理器会在合适的地方插入内存屏障来禁止特定类型的数据重排序。

synchronized关键字

synchronized关键字用于实现同步访问共享资源,它可以保证同一时刻最多只有一个线程执行该段代码,从而保证数据的一致性,synchronized可以修饰方法和代码块,当它用来修饰方法或者一个代码块时,能够锁住整个对象或者类,锁的范围为整个方法或代码块;当它用来修饰一个实例变量时,锁住的是这个实例变量所对应的对象。

final关键字

final关键字可以用于修饰类、方法和变量,当final修饰一个类时,表示这个类不能被继承;当final修饰一个方法时,表示这个方法不能被覆盖重写;当final修饰一个基本类型或者引用类型时,表示这个变量的值一旦赋值之后就不能被修改,final关键字可以提高性能,因为编译器在处理带final关键字的方法或者类时会进行一些优化。

问题与解答

Q1:Java内存模型中的主内存和工作内存有什么区别?

A1:主内存是所有变量存储的地方,而每个线程都有自己的工作内存,其中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,然后再将变量写回主内存,不同的线程之间无法直接访问对方工作内存中的变量,线程间变量的传递均需要通过主内存来完成。

Q2:Java内存模型中的8种操作是什么?它们的作用分别是什么?

A2:Java内存模型中的8种操作分别是lock、unlock、read、load、use、assign、store和write,它们的作用如下:lock和unlock用于把一个变量标识为一条线程独占的状态;read和load用于把一个变量的值从主内存传输到工作内存中;use用于把工作内存中的一个变量的值传递给执行引擎;assign用于把一个从执行引擎接收到的值赋给工作内存的变量;store和write用于把工作内存中的一个变量的值传送到主内存中。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/484617.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
硬件大师硬件大师订阅用户
上一篇 2024年7月12日 15:39
下一篇 2024年7月12日 15:49

相关推荐

  • 小编教你java中线程的状态有哪几种。

    Java 中的线程状态是 Java 多线程编程中的一个重要概念,线程在它的生命周期内会经历多种不同的状态,这些状态反映了线程的运行情况和可执行性,Java 语言定义了以下六种线程状态: 1、新建(New) 线程对象被创建…

    2024年7月18日
    00
  • hashmap是否线程安全?

    一、糟糕的面试面试官:小王,你说说HashMap的是线程安全的吗?小王:HashMap不安全,在多线程下,会出现线程安全问题。他兄弟HashTable线程是安全的,但是出于性能考虑,我们往往会选择ConcurrentHashMap。面试官…

    2023年5月12日 编程分享
    013
  • Java教程之Spring的Async注解线程池扩展方案

    目录Spring的Async注解线程池扩展方案目录1. 扩展目的2. 扩展实现2.1 扩展Async注解的执行拦截器<AnnotationAsyncExecutionInterceptor2.2 扩展Async注解的Spring代理顾问<AsyncAnnotationAdvisor2.3 扩展Asy…

    2023年5月12日
    04
  • 小编教你vc多线程编译怎么实现程序运行。

    VC多线程编译实现程序运行,需要在项目设置中启用多线程支持,并使用相关API进行线程创建、同步和互斥操作。 VC多线程编译怎么实现 在编程中,多线程编程是一种常见的技术,它可以提高程序的执行效率,Visual C++(V…

    2024年7月7日
    00
  • 小编教你怎么看线程多少个g。

    在操作系统中,线程是程序执行的最小单位,一个进程可以包含多个线程,它们共享相同的内存空间和资源,但在处理任务时可以相互独立运行,了解如何查看系统中运行的线程数量,对于系统监控、性能调优以及故障排查等…

    2024年6月11日
    00
  • java接口防止重复提交的方法是什么意思。

    Java接口防止重复提交的方法有很多种,其中一种是在前端处理,在提交完成之后,将按钮禁用。另一种是后端处理,使用拦截器拦截。 Java接口防止重复提交的方法 在Java Web应用中,为了防止用户在短时间内多次提交表…

    2024年7月7日
    00
  • 分享如何检查高CPU/内存消耗进程。

    您可以使用以下命令来检查高CPU/内存消耗进程:,- top 命令可以查看最耗CPU的进程,也可以查看该进程中最耗CPU的线程。,- ps 命令可以查看进程的瞬间信息,包括 CPU 占用率、内存使用量等。 如何检查高CPU/内存消…

    2024年7月6日
    00
  • 说说游戏多开用什么cpu好。

    游戏多开,即同时运行多个游戏客户端,是对CPU性能的极大考验,选择适合游戏多开的CPU时,应考虑其核心数、线程数、时钟频率、缓存大小及热设计功耗(TDP)等因素,以下是一些建议和推荐: 多核性能 游戏多开首先需…

    2024年6月12日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息