Java内存模型(JMM)是一种抽象的概念,它描述的一组规则或者规范,定义了程序中各个变量的访问方式。JMM主要解决了多线程环境中的可见性问题,即当一个共享变量被一个线程修改后,其他线程何时能看见该变化。除了解决可见性问题,JMM还屏蔽如果是各种硬件和操作系统还有就是内存模型的内存访问差异,以实现让Java程序在各种,平台下都能达到一致效果 比如说:程序计数器这一类的硬件资源。 故其内容可概括继发性包括:定义黎明的规则、解决可见
Java内存模型(Java Memory Model,JMM)是Java虚拟机规范中定义的一个概念模型,它描述了Java程序在多线程环境下如何和何时看到其他线程写入的值,以及如何同步访问共享变量,Java内存模型规定了主内存和每个线程的本地内存之间的关系,以及它们之间的交互操作。
主内存与工作内存
Java内存模型将内存划分为两种:主内存和工作内存,所有的变量都存储在主内存中,每个线程都有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,然后再将变量写回主内存,不同的线程之间无法直接访问对方工作内存中的变量,线程间变量的传递均需要通过主内存来完成。
内存间的交互操作
Java内存模型定义了8种操作来完成变量在主内存和工作内存之间的交互过程:
1、lock(锁定):把一个变量标识为一条线程独占的状态。
2、unlock(解锁):把一个处于锁定状态的变量释放出来,让其他线程也能访问。
3、read(读取):把一个变量的值从主内存传输到工作内存中,以便随后的load操作。
4、load(加载):把read操作从主内存中得到的变量值放入工作内存的变量副本中。
5、use(使用):把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。
6、assign(赋值):把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时将会执行这个操作。
7、store(存储):把工作内存中的一个变量的值传送到主内存中,以便随后的write操作。
8、write(写入):把store操作从工作内存中得到的变量的值放入主内存的变量中。
原子性、可见性和有序性
Java内存模型为程序员提供了以下三个保证:
1、原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
2、可见性:指当一个线程修改了一个共享变量的值,新值对于其他线程来说是可以立即得知的。
3、有序性:即程序按照代码的先后顺序执行。
先行发生原则
先行发生原则是指,如果两个操作访问同一个变量,且第一个操作为写操作,第二个操作为读操作,那么第一个操作的结果将对第二个操作产生直接影响,线程A修改了一个共享变量的值,然后线程B读取这个共享变量的值,那么线程B读取到的值将是线程A刚刚写入的值。
volatile关键字
volatile是一个类型修饰符,用于修饰被不同线程访问和修改的变量,它有以下两个特性:
1、保证此变量对所有线程的可见性,即一旦有线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。
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联系删除