Hes*_*sey 24 java caching jvm visibility volatile
我们经常使用它volatile来确保每个Thread都可以看到一个条件变量.
到目前为止,我看到这些volatile字段都是primitive type代码.
请问object现场有这个问题?例如:
class a {
public String str;
public List list;
}
Run Code Online (Sandbox Code Playgroud)
如果有一些线程会访问str和list,我必须添加'volatile'吗?
我想每次访问都Object将直接从中获取Heap,并且Object不会像原始类型一样进行缓存.
是对的吗?
Ste*_*ers 29
您必须区分对象引用和实际对象.
作为参考,您的字段修饰符是相关的.当您将引用更改为其他对象(即引用不同的String)时,其他Thread可能不会注意到该更改.如果要强制实施可见性,则必须使用final或volatile.
堆上的实际对象不受字段修饰符的影响.相反,您如何看待此对象的每个字段由其自己的字段修饰符根据相同的规则确定(是volatile或final否?如果不是,则不强制执行并发线程的可见性)
所以答案是:是的,你必须添加volatile或final.不过,从风格上来说,让场地最终会更好.它具有与Thread相同的效果,但也是一个更强大的声明:此字段无法更改 - 这就是为什么它可以被JVM无忧缓存的原因.出于同样的原因,它带来了一点性能优势volatile,Java不需要关心该字段是否再次发生变化而且不需要增加开销.
您添加是volatile keyword为了告诉编译器它绑定到change. 这样所有线程都会重新确认它们local cached copy与原始线程相同,如果有更改,则会更新它。你通常会发现它与基元有关,因为基元值通常由不同的线程递增或递减等。但对象,尤其是列表永远不会改变,因为它只是对对象的引用。如果您在运行时将不同的对象分配给同一个变量,那么您可以这样做..