问题标签 [java-memory-model]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5690 浏览

java - 设置 HashMap 线程安全吗?

我的程序中有一个HashMap由多个线程访问,并且偶尔由单个线程设置。

例如:

这是由多个线程访问的。每小时一次,单个线程调用:

所以我的问题是这是否是线程安全的。如果两个地图总是有 key ,读取线程是否有可能在不存在"importantKey"的时候访问地图?"importantKey"

编辑:

感谢答案,我意识到这个问题实际上是独立于HashMap. 这更多是关于对象引用分配的问题。

0 投票
4 回答
260 浏览

java - 线程安全但快速访问“最终最终”变量?

我有一个有点像这样的服务器:

如您所见,有处理请求的线程和初始化服务器的线程。请求可以在初始化完成之前进入,因此有一个IllegalStateException.

现在,为了使这个线程安全(所以请求处理程序线程看不到 init 之后的陈旧、null-valued 版本worker),我必须使 worker 不稳定,在其上同步,或诸如此类。

但是,在 init 完成后,worker将不再更改,因此它实际上是 final 的。因此,任何可能发生的锁争用似乎都是一种浪费。那么,我在这里能做的最有效的事情是什么?

现在我知道这在实际意义上并不重要(阅读网络请求等繁重的工作等等,单个锁有什么关系?),但出于好奇,我想知道。

0 投票
3 回答
382 浏览

java - Java中静态单例中访问的变量的内存可见性是什么?

我在项目中经常看到这种类型的代码,其中应用程序需要一个全局数据持有者,因此他们使用任何线程都可以访问的静态单例。

我希望很容易看到发生了什么。可以GlobalData.getInstance().getData()随时在任何线程上调用。如果两个线程以不同的值调用 setData(),即使你不能保证哪一个“获胜”,我也不担心。

但是线程安全不是我关心的问题。我担心的是内存可见性。每当Java中存在内存屏障时,缓存的内存就会在相应的线程之间同步。当通过同步、访问 volatile 变量等时会发生内存屏障。

想象一下按时间顺序发生的以下场景:

线程1中的最后一个值是否value仍然可以是"one"?原因是,线程 2 在调用后从未调用任何同步方法,d.setData("two")所以从来没有内存屏障?请注意,在这种情况下,每次getInstance()调用时都会发生内存屏障,因为它是同步的。

0 投票
2 回答
1025 浏览

java - 如果原始数据是存储在java内存中的对象的一部分?

我知道堆栈内存存储原始类型,对象的地址和对象值存储在堆内存中。

但是如果原语是对象的一部分,那么它将存储在堆或堆栈中的什么位置?

我怎样才能验证它?

谢谢。

0 投票
2 回答
1147 浏览

java - java中的同步和代码重新排序

在某些链接中给出了同步块内的代码重新排序是可能的,而其他一些站点则说不可能。您能否举个例子来描述使用同步时代码重新排序的实际情况?

0 投票
2 回答
100 浏览

java - 在 JMM 下,这种在线程之间传递对象的方式是否安全?

我正在寻找一种将对象从后台线程传递到 UI 线程的安全方法。下面的代码安全吗?

即,JMM 规则是否允许在 doSomethingWithObject 调用期间实际上部分构造对象?此外,JMM 与 Android 及其虚拟机的相关性如何?

0 投票
1 回答
145 浏览

java - SPECIAL POPL ISSUE 的数据竞争示例 Java 内存模型混淆

我对 SPECIAL POPL ISSUE The Java Memory Model 论文中的图 3 感到困惑。

示例(第 5 页,图 3):

解释 1(第 5 页,1.2 偶然循环):因果循环的另一个示例——这一次,描述了可接受的行为——可以在图 3 中看到。为了看到结果r1 == r2 == r3 == 1,其中一个线程必须执行其写入在它执行读取之前。但是每次写入似乎都依赖于它上面的读取。虽然这个值似乎也是凭空而来的,但它不是而且可能是标准编译器转换的结果,如第 2.2.2 节所述。

解释 2(第 10 页,2.2.2 依赖破坏分析和转换):图 3 显示了类似但更令人惊讶的行为。在这种情况下,编译器必须执行更深入的分析,以确定 x 和 y 的值保证为 0 或 1。一种可能的此类分析是确定表示整数所需的位宽的分析程序中的值 [Stephenson et al. 2000]。

在这个例子中 r1 和 r2 可以是== 1onlyif x or y == 1x or y could be == 1only if r1 and r2 == 1。但是 I的分配1只能在r3 = r2 | 1;所以我认为没有办法1到达r1,r2或.xy

那么,这个例子是错误的还是我错了?

0 投票
2 回答
172 浏览

java - “任何对象的默认初始化发生在程序的任何其他操作(默认写入除外)之前”是什么意思?

Java 语言规范 7,第 17.4.5 节:

它到底是什么意思?什么是默认初始化?你能提供一些例子吗?

0 投票
2 回答
105 浏览

java - 发生在关系之前以避免僵局

在我读到的一些文章中,如果在 Java 的多线程程序中维护关系之前发生,则不会出现数据竞争。但我怀疑它是否也有助于防止死锁情况?

我觉得它可能会有所帮助,但无法以适当的方式解释。任何人都可以用发生之前的关系来解释僵局吗?

0 投票
3 回答
403 浏览

java - 实例化Java对象时,是否会自动创建父类的对象?

假设我创建了一个对象,并且运行了一个父类的构造函数。使用此构造函数,是否还会在幕后创建父对象的新对象?

如果没有,private父类的字段存储在哪里?您实际上可以调用super对调用对象不可见的私有字段进行操作的父对象(带有或不带有 )的任何方法。

如果有最熟悉 Java 内存模型的人,非常欢迎他或她的回答!