java-memory-model相关内容
我试图理解为什么这个例子是一个正确同步的程序: a - 易失性线程1:x=a线程2:a=5 因为存在冲突的访问(对 a 进行写入和读取),所以在每个顺序一致性执行中,访问之间的关系必须先发生.假设顺序执行之一: 1.x=a2. a=5 1 发生在 2 之前,为什么? 解决方案 不,在同一变量的 volatile 写入之前(按同步顺序)进行 volatile 读取不一定 happen
..
有人可以按照 Java 内存模型的要求解释 初始化安全 吗? final 字段如何帮助实现初始化安全? 构造函数在确保初始化安全方面扮演什么角色? 解决方案 初始化安全性提供了一个外部线程在其完全构造(初始化)状态下可以看到的对象.前提是对象不应过早发布,即.在它的构造函数中.一旦确保了这一点,JMM 就要求声明为 final 的字段具有某些行为.首先,所有 final 对象字段都保证
..
此问题仅涉及内存可见性,而不是发生在之前和之后.Java中有四种方法可以保证一个线程中对内存的更改对另一个线程可见.(参考 http://gee.cs.oswego.edu/dl/cpj/jmm.html) 写入线程释放同步锁,读取线程随后获取相同的同步锁. 如果一个字段被声明为易失性,写入它的任何值都会在写入线程执行任何进一步的内存操作之前被写入线程刷新并使其可见(即,为了手头的目的,它
..
我知道 JVM 内存模型是为 CPU 的最小公分母而设计的,因此它必须假设 JVM 可以在其上运行的 CPU 的最弱模型(例如 ARM). 现在,考虑到 x64 具有相当强大的内存模型,假设我知道我的程序只能在 64 位 x86 CPU 上运行,我可以忽略哪些同步做法?当我的程序通过虚拟化运行时,这也适用吗? 示例: 众所周知,JVM 的内存模型需要同步对 long 和 double
..
我听说在 Joshua Bloch 写的书中,如果我们重写 finalize 方法,分配和内存收集可能会增加到 430 次. 对我来说很明显,内存收集可能会更慢,因为 gc 需要额外的迭代来释放内存. 但是为什么分配阶段可以增加呢? 解决方案 我已经搜索了原文: 在我的机器上,创建和销毁一个简单对象的时间大约是5.6 纳秒.添加终结器会将时间增加到 2,400 ns.换句
..
我知道 JVM 内存模型是为 CPU 的最低公分母而设计的,因此它必须假设 JVM 可以运行的 CPU 的最弱模型(例如 ARM). 现在,考虑到 x64 具有相当强大的内存模型,假设我知道我的程序只能在 64 位 x86 CPU 上运行,我可以忽略哪些同步实践?当我的程序通过虚拟化运行时,这也适用吗? 示例: 众所周知,JVM 的内存模型需要同步对 long 和 double 的读
..
今天我实验室的一次敏感操作完全出错了.电子显微镜上的一个执行器越过了它的边界,在一连串事件之后,我损失了 1200 万美元的设备.我已经将故障模块中的超过 40K 行缩小到: import java.util.*;A类{静态点 currentPos = new Point(1,2);静态类点{整数 x;输入 y;点(int x,int y){this.x = x;这.y = y;}}公共静态无效
..
谁能告诉我这个类是否是线程安全的? class Foo {私有最终映射一张地图;公共 Foo() {aMap = new HashMap();aMap.put("1", "a");aMap.put("2", "b");aMap.put("3", "c");}公共字符串获取(字符串键){返回 aMap.get(key);}} 编辑:不澄清问题是我的错.根据 JMM 常见问题: 应该提供初始
..
JSR-133 常见问题 说: 但还有更多同步比互斥.同步确保内存由线程写入在同步块之前或期间以可预测的方式可见其他线程的方式在同一台显示器上同步.后我们退出一个同步块,我们释放监视器,它具有将缓存刷新到主缓存的效果内存,这样写的线程可以被其他人看到线程.在我们进入一个同步块,我们获取监视器,其作用是使本地处理器缓存无效这样变量将被重新加载从主内存.然后我们就可以查看所有可见的写入之前的版本
..
我查看了 OpenJDK 源代码 CopyOnWriteArrayList 并且似乎所有写操作都受同一个锁保护,而读操作根本不受保护.据我了解,在 JMM 下,对变量的所有访问(读取和写入)都应该受到锁定或重新排序效果的保护. 例如,set(int, E) 方法包含这些行(处于锁定状态): /* 1 */int len = elements.length;/* 2 */Object[] n
..
你能给我一些关于对象头中究竟存储了什么的信息吗?我知道,它可能依赖于 JVM,但至少对于 HotSpot 来说可能?我正在寻找专门针对第一行的准确描述. 我已经阅读了一些无法用我找到的信息进行正面验证的信息.也许你有一个指向 OpenJDK wiki 的链接,说明了一切? 解决方案 对于 HotSpot: 对象头由一个标记词和一个类指针组成. 标记字有字长(4 byte在
..
从 Java 5 开始,volatile 关键字具有释放/获取语义,以使其他线程可以看到副作用(包括对 非 volatile 变量的赋值!).以这两个变量为例: int i;易失性 int v; 请注意,i 是一个常规的非易失性变量.想象线程 1 执行以下语句: i = 42;v = 0; 在稍后的某个时间点,线程 2 执行以下语句: int some_local_variable =
..
最近,我正在阅读 JSR-133食谱关于Doug Lea的 JSR 133的编译器作家 :JavaTM内存模型和线程规范修订版 . 我在这里读到了这一行: 内存障碍本身不是“同步障碍" 我搜索了一些有关内存障碍和同步障碍之间差异的资源,但找不到任何好的方法.我也无法确定同步障碍与Java与其他语言的比较是否有任何区别. 解决方案 首先,正如@markspace所指出的那样
..
我目前正在尝试了解此JLS关于最终字段的部分. 为了更好地理解JLS中的文本,我还在阅读 Jeremy Manson(JMM的创建者之一)的Java内存模型. 本文包含的示例引起了我的兴趣:如果使具有最终字段的对象 o 对另一个线程 t 两次可见: 首先,“不当"在 o 的构造函数完成之前 接下来,“适当地"使用在 o 的构造函数完成之后 然后 t 可以看到半结构化的 o
..
Java内存模型保证对象的构造和终结器之间发生先发生后关系: 从 对象指向该对象的终结器(§12.6)的开头. 以及构造函数和final字段的初始化: 当一个对象被认为是完全初始化的 构造函数完成.只能看到引用的线程 该对象已完全初始化之后的对象得到保证 查看该对象的final的正确初始化的值 字段. 对于volatile字段也有保证,因为关于对这些字段的所有访问都存在事前
..
您能给我一些有关对象头中确切存储的内容的信息吗?我知道,这可能取决于JVM,但也许至少对于HotSpot?我正在寻找专门针对第一行的确切描述. 我已经阅读了一些信息,这些信息无法用我发现的信息进行正面验证.也许您有一个指向OpenJDK Wiki的链接,说明了所有内容? 解决方案 对于Hotspot: 对象标头由一个标记词和一个克拉斯指针组成. 标记字具有字长(在32位体
..
在尝试了解 SubmissionPublisher 的同时( Java SE 10,OpenJDK中的源代码 | docs ),已经实现了在版本9的Java SE中添加的新类,我偶然发现了对 VarHandle 我以前不知道: fullFence , acquireFence , releaseFence , loadLoadFence 和 storeStoreFence 。 经过一些
..
我正在阅读Brian Goetz所著的"Java并发实践"一书. 3.5和3.5.1段包含了我无法理解的陈述. 考虑以下代码: public class Holder { private int value; public Holder(int value) { this.value = value; } public void assertValue(
..
我试图了解Java 8中的CompletableFuture如何与 Java内存模型.在我看来,出于程序员的理智,以下理想情况下应该成立: 完成CompletableFuture 发生之前任何完成依赖阶段的线程中的动作被执行 注册完成的线程中的操作创建了一个依赖阶段 happen-before 执行了 completion 依赖阶段 java.util.concurrent中有一条注
..
如何设置最大堆栈大小? 我使用jEdit在较大的文件(73 kb)中使用正则表达式进行搜索,但由于StackOverflowException而失败. 我尝试设置-Xss40m,但是它似乎是初始堆栈大小,一段时间后它失败,并出现以下异常 11:45:31 AM [AWT-EventQueue-0] [error] AWT-EventQueue-0: Exception in th
..