问题标签 [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 投票
2 回答
190 浏览

java - 任何单例模式早期实例化的问题

我使用惰性实例化单例模式遇到了一些问题

参考:http ://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 。

同样,使用早期实例化的单例模式有什么问题吗?

0 投票
1 回答
988 浏览

java - Java 7 内存模型与 JSR-133 相同吗?

当我想知道 Java 7 版本中是否发生了任何更改时,我正在重新阅读JSR-133规范。也就是说,如果 133 已过时或仍然有效。

我在 Google 上没有找到任何关于 Java 7 内存模型变化的信息,但我在这里询问以防万一有人知道。

0 投票
6 回答
856 浏览

java - Java 内存模型同步:如何诱发数据可见性错误?

“实践中的 Java 并发”给出了以下不安全类的示例,由于 Java 内存模型的性质,该类可能最终永远运行或打印 0。

这个类试图证明的问题是这里的变量不是线程之间“共享”的。因此线程看到的值可能与另一个线程不同,因为它们不是易失的或同步的。同样由于 JVM 允许的语句重新排序,ready=true 可能设置在 number=42 之前。

对我来说,这个类在使用 JVM 1.6 时总是可以正常工作。关于如何让这个类执行不正确的行为(即打印 0 或永远运行)的任何想法?

0 投票
2 回答
1774 浏览

java - 内联分配作为确保读取顺序的一种方式

在 Java7 的ForkJoinPool类中,有一条关于实现的注释,其中指出:

方法 signalWork() 和 scan() 是主要的瓶颈,因此特别是微优化/损坏。有很多内联赋值(形式为“while ((local = field) != 0)”),这通常是确保所需读取顺序(有时很关键)的最简单方法

我的问题是:内联赋值如何帮助读取顺序(我熟悉 Java 内存模型,但我看不到内联赋值在这里有什么帮助)?

0 投票
4 回答
805 浏览

java - Java并发访问字段,不使用volatile的技巧

前言:我知道在大多数情况下,使用 volatile 字段不会产生任何可测量的性能损失,但这个问题更具理论性,并且针对具有极高准确性支持的设计。

我有一个字段,List<Something>它是在构造后填充的。为了节省一些性能,我想将列表转换为只读地图。在任何时候这样做都需要至少一个可变的 Map 字段,因此使所有线程的更改可见。

我正在考虑执行以下操作:

这可能会导致多个线程生成映射,即使它们以序列化方式进入 get 块。如果线程在地图的不同相同实例上工作,这将不是什么大问题。更让我担心的是:

是否有可能一个线程将新的临时映射分配给映射字段,然后第二个线程看到它map!=null并因此访问映射字段而不生成新的,但令我惊讶的是发现映射是空的,因为 put 操作哪里还没有推送到某个共享内存区域?

评论回复:

  • 线程仅在只读之后修改临时映射。
  • 由于一些特殊的 JAXB 设置,我必须将 List 转换为 Map,这使得从 Map 开始变得不可行。
0 投票
1 回答
4827 浏览

java - JAXB 对并发访问安全吗(它是如何完成的)

我猜 JAXB 调用零参数构造函数,然后开始填充非易失性字段并将内容添加到列表中。

在我自己的代码中:在执行此操作(解组)后,生成的 bean 立即通过某些 add 方法被驱逐到一些工作线程,但不是通过构造函数或任何其他会触发内存模型刷新和重新获取数据的方式从共享区域。

这安全吗?还是 JAXB 在幕后做了一些魔术?我想不出在 java 编程语言中有任何方法可以强制所有线程对所有线程都可见。JAXB 生成的 bean 的用户是否必须担心在并发设置中可能没有明显设置字段?

编辑:为什么有这么多反对票?还没有人能够解释 JAXB 如何确保这项看似不可能完成的任务。

0 投票
3 回答
251 浏览

java - Java,多线程类,配置,避免同步

假设我有一个需要配置、依赖注入等的类。

这是一个人为的例子,但是如果我不能轻松地完成 ctor 中的所有配置怎么办?假设配置在执行早期完成并且不会更改。严格来说,由于内存模型,我必须同步所有对 someConfig 的引用。这个要求在实践中可以放宽吗?

0 投票
1 回答
597 浏览

java - Java 内存模型 - 在跨越内存屏障时究竟刷新到内存中的是什么?

我想我理解单个变量的发生之前的关系。如果我写了一个 volatile 字段,该字段的所有后续读取都将包含这个新值。写入 avolatile会跨越内存屏障并将新值刷新到主内存。

我仍然不清楚在所有其他情况下会发生什么 - 例如Thread.start()synchronized或者新锁java.util.concurrent。他们也跨越了记忆障碍是什么意思?哪些数据从本地缓存刷新到主存?换句话说,穿越的范围是什么?

是不是所有的东西都被冲洗掉了?现在回到volatile,它刷新的不仅仅是单个volatile字段吗?

0 投票
2 回答
811 浏览

java - 运行许多 IO 线程会影响一些 CPU 密集型线程的性能吗?

假设我有一台具有 12MB 缓存的 6 核机器。我将它用于具有几 GB 堆的服务器应用程序(其中大部分是 2 级 Hibernate 缓存)。

我注意到大多数时候我有少数线程主动服务客户端请求(燃烧 CPU 和与 DB 对话),以及大约 30-50 个线程只与客户端进行良好的同步网络 IO。

在学习 Java 内存模型时,我想知道这是否会影响性能。许多网络 IO 线程之一的上下文切换是否会破坏“活动”线程的线程/CPU 缓存?这种级别的并发本身是否有害(除了内存缓存)?

考虑到 CPU 缓存相对于整个应用程序内存有多小,这真的很重要吗?如何确定边界在哪里?

0 投票
3 回答
2218 浏览

java - 有效不可变对象

我想确保根据 Java 内存模型正确理解“有效不可变对象”的行为。

假设我们有一个可变类,我们希望将其发布为有效的不可变类:

我们执行以下操作:


问题是:Java 内存模型是否保证所有线程都必须拥有Outworld.published.get() == 3

根据Java Concurrency In Practice,这应该是正确的,但如果我错了,请纠正我。

3.5.3. 安全出版习语

为了安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全地发布:
- 从静态初始化程序初始化对象引用;
- 将对其的引用存储到 volatile 字段或 AtomicReference 中;
- 将对它的引用存储到正确构造的对象的最终字段中;或
- 将对它的引用存储到由锁正确保护的字段中。

3.5.4。有效的不可变对象

任何线程都可以安全地使用安全发布的有效不可变对象,而无需额外同步。