43得票5回答
易失性保证和乱序执行

重要编辑:我知道关于“发生在”在进行两个赋值的线程中,我的问题是另一个线程是否可能在"a"仍然为null的情况下读取非空的"b"。所以我知道如果你从与之前调用setBothNonNull(...)的线程相同的线程中调用doIt(),它不会抛出NullPointerException。但是如果有...

42得票10回答
不可变性和重排序

以下代码(Java Concurrency in Practice清单16.3)由于明显的原因不是线程安全的: public class UnsafeLazyInitialization { private static Resource resource; public ...

39得票3回答
Java内存模型:volatile变量和happens-before关系

我想澄清一下volatile变量如何与happens-before关系配合工作。让我们假设有以下变量:public static int i, iDst, vDst; public static volatile int v; 以及线程A:i = 1; v = 2; 和线程B:vDst = v...

37得票6回答
Java中的"volatile"是什么意思?

在我们的项目中,我们使用volatile来维护被不同线程访问的变量的相同副本。我的问题是是否可以在static中使用volatile。编译器没有报错,但我不明白为什么要同时使用两者。

36得票2回答
Java中内存屏障的行为

阅读了更多的博客/文章等后,我对内存屏障前/后的加载/存储行为感到非常困惑。 以下是Doug Lea在他关于JMM的澄清文章中的两个引用,它们都非常直观: 当线程A写入volatile字段f时可见的任何内容,当线程B读取f时变得可见。 请注意,为了正确建立happens-before关系...

30得票5回答
不使用volatile实现的双重检查锁定

我看到了关于如何进行双重检查锁定的这个问题: // Double-check idiom for lazy initialization of instance fields private volatile FieldType field; FieldType getField() { ...

30得票3回答
Dalvik的内存模型和Java的一样吗?

Dalvik的内存模型与Java相同吗? 我特别想知道对引用和非long/非double原始变量的读写是否是原子操作,但我也想知道这两个平台的内存模型是否有任何差异。

29得票5回答
在某些表达式中,JIT能否将两个volatile读取合并为一个?

假设我们有一个volatile int a。一个线程执行:while (true) { a = 1; a = 0; } 另一个线程同时在执行while (true) { System.out.println(a+a); } 现在,如果JIT编译器发出与a+a相应的汇编指...

26得票1回答
CompletableFuture、可变对象和内存可见性

我正在尝试理解Java 8中的CompletableFuture如何与Java内存模型交互。对于程序员来说,以下内容应该被理想地保持: 完成CompletableFuture的线程中的操作发生在执行任何受其影响的阶段之前。 注册完成或创建依赖阶段的线程中的操作发生在执行相关依赖阶段之前。 ...

26得票2回答
关于对象的安全发布,final和volatile有什么保证?

来自《Java并发实践》一书: 为了安全地发布对象,必须同时将对象的引用和状态对其他线程可见。可以通过以下方式安全地发布正确构造的对象: 从静态初始化器初始化对象引用 将引用存储到volatile字段或AtomicReference中 将引用存储到正确构造对象的...