问题标签 [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.
java - 同步的行为
我已经阅读了同步块内的代码符合“发生在之前”语义,因此写入同步块内的所有值都应该对其他线程连续可见。此外,我读过缓存仅在同步块终止时刷新。如果仅使用同步块终止刷新缓存,则在下面描述的场景中如何强制执行上述“发生在之前”的语义?
线程 A 引用了对象 C,并在 C 上同步的同步代码中更改了 C 的一个字段。线程 B 也获得了对象 C 的引用。现在线程 A 在同步代码完成之前被挂起。线程 B 开始行动并在代码中访问对象 C 的字段,而 C 上没有同步。
现在是否保证线程 B 可以看到线程 A 所做的更改?
java - 使用 java.util.concurrent 类时是否应该同步以避免可见性问题?
使用任何 java.util.concurrent 类时,我是否仍需要同步对实例的访问以避免不同线程之间的可见性问题?
更详细地阐述这个问题
当使用 java.util.concurrent 的实例时,一个线程是否有可能修改该实例(即,将一个元素放入并发 hashmap 中)而后续线程不会看到修改?
我的问题源于这样一个事实,即如果对值的访问不同步,Java 内存模型允许线程缓存值而不是直接从内存中获取它们。
java - Dalvik 的内存模型和 Java 的一样吗?
Dalvik 的内存模型和Java 的一样吗?long
我对引用和非/非原始变量的读写是否double
是原子的特别感兴趣,但我也想知道两个平台的内存模型之间是否有任何差异。
java - Java中的“易失性”是什么意思?
我们volatile
在我们的一个项目中使用来维护不同线程访问的变量的相同副本。我的问题是是否可以volatile
与static
. 编译器没有给出任何错误,但我不明白同时使用两者的原因。
java - Java并发:最终字段(在构造函数中初始化)是线程安全的吗?
谁能告诉我这个类是否是线程安全的?
编辑:我的错没有澄清这个问题。根据JMM 常见问题解答:
应该提供初始化安全的新保证。如果一个对象被正确构造(这意味着在构造过程中对它的引用不会逃逸),那么所有看到对该对象引用的线程也将看到在构造函数中设置的其最终字段的值,而无需同步。
这让我混淆了 aMap 的集合是aMap = new HashMap<String, String>();
. 所以其他线程可以看到这些
或不 ?
编辑:我发现这个问题完全符合我的问题
c# - 具有释放/获取语义的易失性
从 Java 5 开始,该volatile
关键字具有释放/获取语义以使副作用对其他线程可见(包括对非易失性变量的赋值!)。以这两个变量为例:
请注意,这i
是一个常规的非易失性变量。想象一下线程 1 执行以下语句:
在稍后的某个时间点,线程 2 执行以下语句:
根据 Java 内存模型,v
线程 1 中的写入和线程 2 中的读取v
确保线程 2 看到i
线程 1 中执行的写入,因此打印值 42。
我的问题是:volatile
在 C# 中是否具有相同的发布/获取语义?
java - java程序执行后如何释放内存
我已经安排了一个 jar 文件在使用 mysql 的系统启动时运行。
它用于将数千条记录从一个数据库推送到另一个数据库,在每次执行期间它会占用大量 cpu 内存,但一旦完成(执行成功完成),它永远不会释放占用的 cpu 内存,直到系统重新启动。
这个 jar 计划每 4 小时运行一次。我怎样才能释放这个占用的内存?
——谢谢,马努
感谢您的关注 :)
java - java - 在同步块内重新排序
是否可以在同步块中重新排序语句?例如
其中,statement1 和 statement2 不相互依赖。处理器或编译器可以重新排序这些语句吗?
谢谢你。
java - Java - 不可变数组线程安全
我有一个关于 Java 内存模型的问题。这是一个提出问题的简单类:
据我所知,JMM 保证 final 字段的值在构造后对其他线程可见。但我想确保其他线程在构建后会看到存储在数组中的最新版本的数据。
当然上面的代码只是一个简单的例子,实际上我想为直接字节缓冲区实现一个简单的缓存,我不想依赖一些 Collection 类。目前我正在使用 ReentrantReadWriteLock 来确保正确的行为,但如果可能的话,我想避免它。
java - 通过 JVM/JIT 插入栅栏指令
Java 内存模型提供了 DRF 保证(数据竞争自由),这意味着当在 Java 的宽松内存模型下执行时,无数据竞争的程序将给出与顺序一致执行相同的行为。我有以下问题:a)给定一个活泼的程序,编译器(非常具体的任何jvm实现)是否进行延迟集分析/线程逃逸分析等以找出需要插入的栅栏指令以使其竞赛-自由的?还是 JIT 是根据它在哪里执行的?
b)如果编译器做到了(在这种情况下为jvm),为什么我们不能只编写活泼的程序,因为编译器无论如何都会将其转换为无竞争的程序?如果编译器有任何方法可以做到这一点(通过插入栅栏使其无竞争),那么如何(有意地)编写活泼的程序,比如java中并发数据结构的一些实现?
c) 或者 jvm 本身不会将 racy 转换为无种族程序的第三种可能性,但存在其他分析可以为我们做到这一点。是这样吗?