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

java - 是否可以在 Java 中有效地实现 seqlock?

另一个问题让我想知道seqlock 是否可以用 Java 中的 volatile 版本计数器有效地实现。

这是一个原型实现,对于这种情况,只有一个编写器线程:

基本思想是在写入之前和之后增加版本号,并让读者通过验证版本号是否相同甚至偶数来检查他们是否获得了“一致”读取,因为奇数表示“正在写入”。

由于版本是易变的,因此在编写线程和读取线程中的关键操作之间存在各种发生前的关系。

但是,我看不到是什么阻止了 (2) 处的写入高于 (1),从而导致读者看到正在进行的写入。

例如,以下 volatile 读取和写入的同步顺序,使用每行旁边注释中的标签(还显示了data非 volatile 的读取和写入,因此不属于同步顺序的一部分,缩进):

ISTM认为在5(数据的读取)和2b(数据的第二次写入)之间没有happens-before,因此2b可能发生在读取和读取错误数据之前。

如果这是真的,那么声明write()synchronized帮助吗?

0 投票
2 回答
5703 浏览

java - final vs volatile 保证对象的安全发布

来自 Java concurrency in practice 一书:

为了安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全地发布:

  • 从静态初始化器初始化对象引用

  • 将对它的引用存储到 volatile 字段或 AtomicReference

  • 将对它的引用存储到正确构造的对象的最终字段中

  • 将对它的引用存储到由
    锁正确保护的字段中。

我的问题是:

  1. 要点 2 和 3 之间有什么区别?我对安全发布对象方面的volatile方法和方法之间的区别感兴趣。final
  2. 他在第 3 点中正确构造对象的最终字段是什么意思?在开始项目符号点之前,作者已经提到他们正在谈论一个正确构造的对象(我假设它不会让this引用 escape )。但是为什么他们又一次提到了正确构造的对象?
0 投票
3 回答
2675 浏览

java - OutOfMemoryError:在 Rails 控制台上运行 jruby 但未使用 -J-Xmx 定义的所有内存时的 Java 堆空间

我有一个使用 jruby 1.7 的 rails 3 应用程序,我试图在需要大量内存的情况下在本地开发环境(带有 jdk 7 的 OS X 10.8)上使用 rails 控制台。我按如下方式运行 rails 控制台:

jruby -J-Xms1024m -J-Xmx4096m -J-XX:+UseConcMarkSweepGC -J-XX:+CMSIncrementalMode -S rails c samuel_hml

然后我使用 rails 控制台开始一个长时间运行的进程/

jruby java 进程在引发“OutOfMemoryError: Java heap space”错误后总是失败。但是当我运行控制台并检查活动监视器时,它实际上从未使用超过 700 mb。

0 投票
2 回答
111 浏览

java - JVM 能否优化数组的多次读取

多次读取同一个索引时,JVM可以优化数组读取吗?考虑以下:

array[i]在循环中被读取两次。假设array[i]没有在循环中重新分配,是否允许 JVM 假设它array[i]没有改变并因此只读取它的值一次?由于array是传入的可变对象,因此可以想象它在第一次和第二次读取之间发生了变化。

我查看了生成的字节码,它确实读array[i]了两次(daload)。JVM 是否允许将其优化为一次读取?

0 投票
2 回答
185 浏览

java - Java:Java 编译器如何计算程序的内存使用量?

我正在解决这个问题。它需要 50000bytes 的内存限制。因此,如果我分配一个大小为 1000 X 1000 的 int 二维数组,它不应该超过内存边界吗?

PS:我看到了这个问题的解决方案,程序员分配了一个大小为 m X m 的二维数组。如果 m 等于 1000,那么我认为会超出内存限制。但是 codechef 已经接受了他的解决方案。

codechef 编译器的机制有问题还是我遗漏了什么?

0 投票
2 回答
1199 浏览

java - 我的 vector3 类中的线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常

好的,所以我得到了这个空指针异常,我自己和我的讲师都无法弄清楚。(他认为它的逻辑不好,我倾向于同意)

我正在制作自己的 3d 对象,并将其直接渲染为 x 和 y 的屏幕空间坐标。这正是我想要的练习,我能够优化数字以获得平滑的渲染,而不会在我的课程计算机上丢掉很多帧(这意味着我不能为我的讲师重现空指针)但是一旦我运行它家里的野兽机器代码帧似乎运行得更快,并且我正在渲染的立方体反复闪烁,同时向控制台吐出空指针异常(即使我操纵数字以减慢它的速度)。但它永远不会崩溃。

这是正在使用的类。

Viewport.java(附加到 JFrame)

立方体.java

顶点.java

Vector3.java

我能做的最好的事情是public double x(){return xyz[0];} 在视口类中调用paint方法时在 Vector3 类中跟踪它,但是当我尝试逐步执行时,它们永远不会为空。我得到的印象是 jvm 在尝试在旋转期间为顶点重新分配新位置时正在赶上自己。

编辑:堆栈跟踪

附加信息:

管理器.java

Wind.java

道具.java

道具.props

目录.dir

0 投票
5 回答
3875 浏览

java - Java并发中“程序顺序规则”的解读

程序顺序规则规定“线程中的每个动作都发生在该线程中的每个动作之前,然后在程序顺序中出现”

1.我在另一个线程中读到一个动作

  • 读取和写入变量
  • 监视器的锁定和解锁
  • 开始和加入线程

这是否意味着读取和写入可以按顺序更改,但读取和写入不能通过第 2 行或第 3 行中指定的操作更改顺序?

2.“节目顺序”是什么意思?

举例说明会很有帮助。

其他相关问题

假设我有以下代码:

首先,它是一个单线程应用程序,以保持简单。编译器注意到它需要检查两次时间,并且还注意到一个与周围的时间注释行没有依赖关系的代码块,因此它看到了重新组织代码的潜力,这可能导致 Block1 没有被计时调用包围在实际执行期间(例如,考虑这个顺序 Line1->Line2->Block1)。但是,作为程序员,我可以看到 Line1,2 和 Block1 之间的依赖关系。Line1 应该紧接在 Block1 之前,Block1 需要有限的时间才能完成,然后 Line2 紧随其后。

所以我的问题是:我是否正确测量了块?

  • 如果是,是什么阻止编译器重新排列顺序。
  • 如果不是,(在通过 Enno 的回答后认为是正确的)我能做些什么来防止它。

PS:我从最近在 SO 中提出的另一个问题中窃取了此代码。

0 投票
1 回答
711 浏览

websphere - 部署在一个 WAS 实例上的 EAR 是否共享相同的堆空间

当 wesbpher 应用程序服务器正在运行时。它基本上是在运行一个 JVM。现在,如果我在 WAS 上部署两个 EAR 项目,这两个 EARS 是否共享同一个 JVM。是的,我猜是的。

但后来我的问题变成了这两个 EAR 是否也共享相同的堆空间?我的猜测是否定的,但这怎么可能?一个 JVM 只能提供一个堆,对吗?

为简化起见,我们假设只有一个 WAS....没有节点和集群。

0 投票
8 回答
12811 浏览

java - 不可变对象的所有属性都必须是最终的吗?

不可变对象必须具有所有属性final吗?

据我说不是。但我不知道,我是否正确。

0 投票
4 回答
1092 浏览

java - 具有非最终字段的不可变对象如何成为线程不安全的?

说我们有这个

是什么让这个线程不安全?从这个问题开始。