小编分享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

相关推荐

  • 说说如何实现linux多线程编程。

    在Linux环境下,多线程编程是一种常见的并发编程方式,它允许程序同时执行多个任务,从而提高了程序的执行效率,本文将详细介绍如何在Linux环境下实现多线程编程。 线程的基本概念 线程是操作系统能够进行运算调度…

    2024年7月11日
    00
  • Java教程之Spring的Async注解线程池扩展方案

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

    2023年5月12日
    04
  • 什么是线程让步?

    在校园中,经常会看到很多同学一起打篮球,当某个同学抢到篮球后可以拍一会儿再传递给其他人,大家重新开始抢篮球,这个过程就相当于程序中的线程让步。线程让步可以通过yield()方法来实现,该方法和sleep(long mil…

    2023年5月6日
    05
  • java接口防止重复提交的方法是什么意思。

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

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

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

    2023年5月12日 编程分享
    013
  • 小编教你jconsole及jvisualvm远程监视websphere服务器JVM的配置示例分析。

    jconsole和jvisualvm是Java JDK自带的工具,可以远程监视Websphere服务器JVM的配置。jconsole可以监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。而jvisualvm则是一…

    2024年7月10日
    00
  • 我来说说storm崩溃问题怎么解决。

    Storm是一个开源的分布式实时计算系统,被广泛应用于大数据处理、实时分析等领域,在使用过程中,可能会遇到Storm崩溃的问题,本文将介绍一些常见的Storm崩溃问题及其解决方法。 1. 内存不足导致崩溃 Storm在运行过…

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

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

    2024年6月11日
    00

联系我们

QQ:951076433

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