11得票1回答
Java中是否会预取来自引用数组的对象?

假设我们在内存中有1000个相同类型的对象(它们是在不同的时间创建的,其他对象也在其中创建)。 我们有一个数组,它保存着对这1000个对象的引用。 问题 如果我们按顺序遍历数组,CPU缓存中会预取什么?只有数组保存的引用,还是这些引用也会被解除引用并将对象加载到缓存中? Java(JVM)是否...

7得票2回答
如何理解Java语言规范中的volatile示例?

我认为Java规范中关于volatile的示例有点错误。 在8.3.1.4. volatile字段中,它说: class Test { static int i = 0, j = 0; static void one() { i++; j++; } static v...

9得票3回答
在实践中,对象构造是否保证所有线程都看到非 final 字段已初始化?

Java内存模型保证了对象的构造和finalize方法之间存在happens-before关系: 当一个对象的构造函数结束时,会有一个从该对象的构造函数末尾到其finalize方法(§12.6)开头的happens-before边缘。 此外,构造函数和final字段的初始化也是如此: ...

9得票2回答
一个线程可以通过安全发布首先获取一个对象,然后进行不安全发布吗?

这个问题是在我阅读这篇答案之后产生的。 代码示例: class Obj1 { int f1 = 0; } volatile Obj1 v1; Obj1 v2; Thread 1 | Thread 2 | Thread 3 -------------------...

8得票4回答
易变的 + 不可变的容器对象 = 线程安全?

我有一本书《Java Concurrency Pratique》中的示例,它说使用volatile和immutable holder对象可以实现线程安全。但我不理解书中给出的示例。 代码如下: public class VolatileCachedFactorizer extends Ge...

8得票2回答
Java 内存模型:一条关于顺序一致性的 JLS 语句似乎不正确

我正在阅读JLS的第17章。线程和锁定,其中关于Java中顺序一致性的以下说法似乎是不正确的: 如果程序没有数据竞争,则程序的所有执行将呈现出顺序一致性。 他们将数据竞争定义为: 当一个程序包含两个冲突访问(§17.4.1),这些访问未按happens-before关系排序时,就会发生数...

21得票2回答
请解释Java内存模型中所述的初始化安全性。

有人能解释一下Java内存模型所要求的初始化安全性是什么吗? final字段如何帮助实现初始化安全性? 构造函数在确保初始化安全性方面扮演了什么角色?

11得票4回答
Java内存模型:混合使用非同步和同步

假设有这样一个类:public void MyClass { private boolean someoneTouchedMeWhenIWasWorking; public void process() { someoneTouchedMeWhenIWasWo...

16得票3回答
举升和重排序是相同的吗?

我从《Effective Java》中读到,在缺乏同步的情况下,虚拟机可以将序列A转换为序列B,并称之为hoisting。我还在某处读到,如果变量没有声明为volatile,则涉及变量的指令可以被重新排序。那么hoisting和重新排序是一样的吗? while (!done) sequ...

10得票4回答
理解 happens-before 和同步

我正在尝试理解Java happens-before order 概念,有几个地方似乎很令人困惑。据我所知,happens before只是一组操作上的顺序,并不提供有关实时执行顺序的任何保证。实际上(强调我的): 引用块: 应注意,两个操作之间存在happens-before关系并不一定...