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

相关推荐

  • 我来教你c#中多线程。

    C#中多线程是实现并行处理的一种方式,可以提高程序的执行效率。 在C中,多线程是一种处理多个数据的有效方法,通过使用多线程,我们可以同时执行多个任务,从而提高程序的执行效率,本文将详细介绍如何在C中使用多…

    2024年7月12日
    01
  • 什么是线程让步?

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

    2023年5月6日
    05
  • 说说java死锁的必要条件有哪些。

    Java发生死锁的四个必要条件包括:1. 互斥使用,即当资源被一个线程占用时,其他线程不能使用;2. 不可抢占,资源请求者不能强制从资源占有者手中夺取资源,只能由资源占有者主动释放;3. 请求和保持,指资源请求者…

    2024年7月10日
    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 扩展As…

    2023年5月12日
    04
  • 分享在Java中runnable和callable有什么区别。

    在Java的多线程开发中,Runnable和Callable都扮演着关键角色。Runnable接口从Java 1.1版本开始就存在,其主要功能在于执行任务但无法返回结果。与之不同,Callable接口自Java 1.5版本起被引入,它不仅允许线程执行…

    2024年7月14日
    00
  • 说说如何实现linux多线程编程。

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

    2024年7月11日
    00
  • 关于win7系统下使用ReleaseSemaphore函数释放信号灯问题。

    在win7系统下,使用ReleaseSemaphore函数释放信号灯时可能会遇到问题。 在Windows操作系统中,信号灯(Semaphore)是一种用于控制多个线程对共享资源的访问的同步机制,它可以用来保护临界区,防止多个线程同时访问…

    2024年7月11日
    00

联系我们

QQ:951076433

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