问题标签 [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 - Java 内存模型只是 Java 范围的还是实际上 JVM 范围的?
我看到它总是被称为 Java-Memory-Model,但到目前为止,我本能地认为它适用于整个 JVM 生态系统。
它是否仅适用于 Java 创建的应用程序,或者任何字节码 JVM 兼容的可执行文件也可以享受它的保证?
我已经通过“内存模型”查看了 JVM 规范,但找不到太多关于它的信息。另一方面,Java 规范对它进行了详尽的描述,给我留下的印象是内存模型是特定于 Java 的。
谢谢
java - 共享内存(int)与java线程的同步
在我们的应用程序(用 Java 为 Android 编写)中,我们有一个Thread
包含 int 字段的派生类:
该类MyThread
仅从int 字段读取,而我希望另一个线程写入它(如上面的示例中所示)。
据我所知,Java 中的 int 等原始类型是原子读/写的。
我应该保护对这个 int 字段的访问(使用synchronized
关键字)吗?
我在这里读到,根据 Java 内存模型,如果没有显式通信,甚至可能看不到对几个线程共享的内存的更新
Quote: 没有明确的通信,你不能保证哪些写入被其他线程看到
我应该保护对这个字段的访问,还是另一个线程可以(原子地)更新它而不需要任何修改?
java - 数据库打开器中的并发
我不知道如何进行正确的并发操作,所以我只是尝试调整我的代码。并且完全迷失在构造函数的并发性和静态最终字段的并发性中......
//我的openhelper类
这就是我在线程中使用的方式:
我想要的是,如果其他实例正在处理完全相同的数据库,则不应关闭它。
任何帮助,将不胜感激。
java - StoreLoad 内存屏障
我无法理解JSR-133 Cookbook中StoreLoad屏障的定义。
商店1;存储加载;加载2
StoreLoad 屏障使用 Store1 的数据值而不是从更新的存储到由不同处理器执行的相同位置的数据值来防止后续加载不正确。
这是否意味着如果没有StoreLoad屏障,处理器可以将 Store1 存储到其写入缓冲区并从其写入缓冲区加载此存储的值,即使其他一些处理器写入相同的内存位置并刷新到 Store1 和之间的缓存负载1?
java - 在 Java 中使用基于双重检查锁定的单例是否安全?
Wikipedia上列出了 Java 中 Singleton 的一种实现:
Java语言规范 17,第 5 段指出
当一个对象的构造函数完成时,它被认为是完全初始化的。只有在对象完全初始化后才能看到对该对象的引用的线程可以保证看到该对象的最终字段的正确初始化值。
好的,假设我们的 SingletonDemo 类有非 final 字段。那么,并发线程将能够读取默认值而不是构造函数中指定的正确值吗?
java - Java - 发生在之前 - 易失性
我有以下代码
如果我increment()
从多个线程调用同一个对象,我会得到以下输出(在您的机器上可能会有所不同)
查看重复的数字,我认为happens-before似乎被破坏了,因为考虑到前三个数字(2 3 2),如果线程看到 3 ,则增量已经发生,并且由于变量是易失性的,因此它的值应该是 3 或更多但是在任何线程中不能为 2。
但是,这里的打印行似乎已经重新排序,重新排序该行是否正确?我在这里想念什么?我在 JDK 7 (Eclipse) 上运行
java - 为什么 volatile 变量比普通同步更有效
有人告诉我,使用 volatile 变量比使用同步块(读取或写入)时使用它更有效。
直到 Java 1.4 我才明白为什么(因为那时线程不必刷新和刷新所有可访问的内存)。
但是从 Java 1.5 开始,我发现使用 volatile 变量和同步块之间的唯一区别是锁获取机制。
买锁真的那么贵吗?如果是这样,那是为什么呢?
java - 是否保证在一个线程中对非易失性成员变量的赋值可以在另一个线程中看到?
考虑下面的 Java 示例。请注意,没有一个类成员变量被声明为volatile
. 如果我正确理解了内存模型和“发生在之前”规则,Java 实现可以优化该run()
方法,使其永远运行,即使另一个线程调用该stopNow()
方法。发生这种情况是因为该run()
方法中没有强制线程stop
多次读取值的内容。那是对的吗?如果不是,为什么不呢?
java - 同步和易失的 JMM
很多次我看到这样的结构:
我们在其自身的开头/结尾有读/写 membars synchronized
。那么,我们可以volatile
从 o 中删除吗,因为synchronized
它本身有释放/获取语义?
java - 同步是否保证一个线程会看到另一个线程正在修改的非易失性变量的最新值?
这是一个简单的例子:
所以我只想获得一个好的值counter
,而不是 cpu 缓存中的卡住值,因为该变量是非易失性的。目标是不使计数器易失,因此它不会影响执行增量的线程 A,而只会影响线程 B,我不在乎,当它读取变量时。
只是为了记录,我计划counter
在线程 A 已经完成时从线程 B 读取值......