打捞回帖、回信来发博客是个偷懒的好办法
ZZZzzz....ZZZzzz....
------------------------------------------------------------
xuhang1128 写道
1.比如上面线程1执行to方法,我觉得就是先将3赋值给a,然后a写到主内存,
上面 assign操作所说的, transfers a value from the thread's execution engine into the thread's working copy of a variable
这句话里面的 thread's execution engine和 thread's working copy of a variable分别代表什么啊,我的理解就是将3赋值给a,然后又是用store命令将 thread's working copy of a variable搞到 main memory,这时候还不完了吗,为什么后面又是 write?
2.还有上面的线程2执行的fro方法的read所说的master copy of a variable to a thread's working memory ,这里的
master copy of a variable 又是指什么呢?规范里面好像说 thread's working memory可以使寄存器,高速缓存之类的东西,之后又用load操作将main memory 将value值搞到 thread's working copy of a variable,这里的 thread's working copy of a variable是局部变量吗还是什么
讨论前,先来看看这几个操作的含义(书上有我就不重新打一遍了,但与出版社有版权协议,不太方便粘贴复制,就给你贴图片了):
主内存和工作内存是什么,在这段前面的2节里面有更详细的介绍,内容太多我就不全部粘贴了,反正还有2周书就应该能出来。我做个类比可能好理解一些,简单来说你可以把它们的关系理解成PC机里面的“内存”和“处理器Cache”之间的关系,所有数据在内存中都用,但是要用的时候Cache中都有一份拷贝,如果是多CPU或者多核处理器,同一份数据还可能在不同的Cache中还有拷贝,解决内存与Cache的一致性问题,硬件里有各种一致性协议。而JVM的内存模型其中一个任务也是解决main memory和working memory之间的一致性问题。
“thread's working copy of a variable”不是局部变量,它就是工作内存中的变量拷贝副本而已,事实上在JMM中一开始就从定义了“variable”的含义,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后者是线程私有的 ,不会被共享,自然就不存在竞争问题。
关于为何store之后又要write的问题,从上面图片你可以看到,这2个操作是作用在不同区域上的,你把main memory和work memory看作2间房子,这2个操作就好比开门,要把物品A从房间以拿到(复制到)房间B,自然要分别进行“拿出来”和“放进去”2个操作。为什么不定义一个诸如transfer之内的操作一次过完成呢?那是因为这6个操作都是“原子的”,不可拆分,如果定义一个原子的“transfer”操作当然也可以完成任务,但原子操作的范围更大,也就意味这个操作的锁定时间更长。这与JMM规范的基本思想:既准确又宽松(见下面图片)相违背了。
xuhang1128 写道
JVM栈,操作数栈,本地栈只是抽象的概念,HotSpot VM使用的Java栈就直接融合了概念上的JVM栈与本地栈,而在被编译过的方法的栈帧里不存在操作数栈——消失了 。不要把抽象概念与具体实现混为一谈。
这是别人说的,请问上面说的编译过的方法操作数栈消失了是什么意思啊
首先,需要弄清楚概念,你这里发生混淆了。HotSpot里面的“本地方法栈”(Native Method Stacks)和“Java虚拟机栈”(Java Virtual Machine Stacks)合二为一了。这意味着Java方法调用和本地方法(譬如JNI方法调用)使用的是同一个栈,从使用上理解,就是-Xoss参数和-Xss参数变成了同一个,因此在HotSpot里面-Xoss无效。而“操作数栈”(Operand Stack)是栈帧(Stack Frame)的一部分,栈帧说白了就是Java虚拟机栈的栈元素。它是客观存在的,不会消失。由于JVM规范的指引或者说是限制,各种Java虚拟机都是基于栈结构的,这里的栈就是操作数栈,它是指令执行的基本前提。所以在各种虚拟机中,甚至在一个虚拟机的解析和编译执行引擎中它可以有不同的存在形式,但是总谈不上“消失”的(
这里有陷阱,请看撒迦的回帖)。当然,不基于栈的虚拟机,譬如Google Android的Dalvik虚拟机(基于寄存器架构)就可以没有操作数栈,当然,那也已经不是严格意义上的“JVM”了。
xuhang1128 写道
字节码指令不还有对操作数栈的操作码,不懂了哎
“操作数栈的操作码”这个提法不妥当的。字节码指令,或者说操作码(Opcodes)不放在操作数栈上,操作数栈既然都命名为“操作数(Operand)”,那肯定是只放运算参数、中间过程结果和运算结果的啊,放个Opcodes上去有什么意思呢?
分享到:
相关推荐
JMM借鉴了CPU-缓存-主内存的模型,即线程对共享变量的访问并不是直接访问主内存,而是通过访问共享内存的一个副本,这个副本称为工作内存。工作内存可以是寄存器、CPU缓存或主内存的一部分,具体取决于虚拟机的实现...
JMM的重要性在于它提供了一个跨平台的内存模型,使得Java开发者可以更好地理解Java语言的语言特性和内存相关的内容。JMM的概念包括堆、栈、本机内存、防止内存泄漏等方面。 本文将从JMM的简介、堆和栈、本机内存、...
深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...
Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何保证各个线程对共享数据的一致性视图。JMM的主要目标是定义程序中各个变量的访问规则,以及在...
这本书"深入理解Java内存模型"显然是为了帮助读者深入探讨这个主题,以便更好地理解和解决并发编程中的问题。 Java内存模型主要涉及以下几个核心概念: 1. **主内存**:所有线程共享的数据存储区域,包括类的静态...
JMM定义了8种基本操作,以确保主内存和工作内存之间的交互具有原子性: 1. `lock`:锁定主内存变量,使变量只能由当前线程访问。 2. `unlock`:解锁主内存变量,允许其他线程锁定。 3. `read`:从主内存读取变量值到...
Java运行时内存模型图
- **工作内存**: 每个线程的私有缓存,用于存储从主内存中复制的变量副本,执行计算操作后可能更新回主内存。 2. **内存间交互** - **读写操作**: 线程从主内存读取变量到工作内存,然后在工作内存中进行计算,...
Java 内存模型(Java Memory Model,简称 JMM)是 Java 平台中关于线程如何访问共享变量的一套规则,它定义了线程之间的内存可见性、数据一致性以及指令重排序等关键概念,对于多线程编程和并发性能优化至关重要。...
1. **内存分层**:在JMM中,内存分为两部分:主内存(Main Memory)和工作内存(Working Memory)。主内存是所有线程共享的存储区域,包含所有实例字段、静态字段和数组元素。工作内存则是每个线程私有的,类似于栈...
Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间共享变量的访问规则的一个抽象概念,它规定了线程如何与主内存交互,以及对共享变量的操作顺序。在Java并发编程中,理解JMM至关重要,因为它直接...
2. 主要过程是将变量从主内存拷贝的每个线程各自的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存。 3. 如果存在两个线程同时对一个主内存中的实例对象的变量进行操作就有可能诱发线程安全问题。 ...
Java内存模型是并发编程中一个至关重要的概念,它定义了共享变量的访问规则,以及这些变量如何在多线程环境下进行读写操作。在深入理解Java内存模型之前,我们需要先了解并发编程模型的分类,然后掌握Java内存模型的...
Java内存模型,简称JMM(Java Memory Model),是Java虚拟机规范中定义的一个抽象概念,它描述了在多线程环境下,如何在共享内存中读写变量,以及这些读写操作的可见性、原子性和有序性。这个模型规定了线程与主内存...
JMM是Java并发编程的基石,它通过定义主内存和工作内存之间的交互规则,以及原子性、可见性和有序性三个特性,为编写正确的并发程序提供了保障。理解JMM的原理和特性,以及如何在代码中应用这些特性,对于Java开发者...
在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...
Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了线程如何共享和访问内存,以及在多线程环境中如何保证数据一致性。理解JMM对于编写高效、正确且线程安全的Java代码至关重要。 ...
根据提供的文档信息,本文将详细解析并发编程中的关键概念——原子性、可见性及有序性,并结合Java内存模型(JMM)来深入理解这些概念。同时,我们也会通过具体示例来探讨这些问题在实际编程中的应用。 ### 一、并发...