Java 施工人员是否应设置门店屏障?
你是否应该在施工人员中设置门店屏障 这里有一个例子。最初假设Java 施工人员是否应设置门店屏障?,java,c++,java-memory-model,memory-model,Java,C++,Java Memory Model,Memory Model,你是否应该在施工人员中设置门店屏障 这里有一个例子。最初假设global\u f=f=r=0。 一个线程A创建一个对象,分配给一个字段,然后分配给一个全局变量: class Foo { int x; void Foo(int x) { this.x = x; } } f = new Foo(42); global_f = f; 另一个线程B从全局变量获取引用,然后读取字段 r = global_f.x; 假设执行时线程B从线程B读取对象引用,那么它
global\u f=f=r=0
。
一个线程A创建一个对象,分配给一个字段,然后分配给一个全局变量:
class Foo {
int x;
void Foo(int x) {
this.x = x;
}
}
f = new Foo(42);
global_f = f;
另一个线程B从全局变量获取引用,然后读取字段
r = global_f.x;
假设执行时线程B从线程B读取对象引用,那么它可以从X
读入r
?是否总是42岁
我对C++和java的行为感兴趣。据我对内存模型的理解,r
不能保证为42
为了确保对象的字段被正确初始化,我们通常可以在构造函数的末尾设置存储屏障。这似乎在C++和java中都有缺陷。至少对于Java来说,最终字段的一切都很好,不是吗?这在实践中并不重要,因为至少在x86和AMD64上,存储屏障是NOP。但是,在ARM或POWER等其他体系结构上并非如此。在Java中,除非将
x
字段声明为final
,否则不能保证r
将是42
为了确保对象的字段被正确初始化,我们通常可以在构造函数的末尾设置存储屏障。这似乎在C++和java中都有缺陷。 这是一个评论,不是一个问题。然而,相反的观点是,在所有构造函数的末尾放置一个隐式屏障会在各种情况下导致不必要的性能损失;e、 g
- 对于单线程代码
- 对于未发布
的多线程代码f
- 对于多线程代码,通过同步方法保护对
的访问x
volatile
与C++有很大的不同,我不明白为什么要在这里单独列出构造函数。这种情况与设置x
的任何其他方法调用没有区别。