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