如果我在同步方法或同步块(synchronized block)中访问一个对象,该访问元素中的所有对象是否也同步?
假设有一个对象 Queue
具有同步的 add()
和 take()
方法,接受并分发复杂对象 事物
。 Thing
有很多列表,其中包含其他不同的对象。
现在图像线程 Before
创建 Thing
并将一些现有对象放入 Thing
中,修改其中一些对象等等。 Before
线程将 Thing
添加到 Queue
。稍后线程 After
从 Queue
中获取 Thing
。
问题:Thing
及其所有子对象/子对象是否会处于与 Before
相同的状态?即使线程 After
可能更早地处理这些子元素之一?因为我对线程 After
的处理器进行成像,可能仍然有一些关于该子元素的缓存信息(该子对象的地址仍然相同)。只有通过以同步方式访问父对象 Thing
,所有这些缓存的内容才会失效?
请不要给出使用并发库等答案。我想了解发生了什么。
最佳答案
Java 内存模型中的重要概念是happens-before order。 . 先于读取操作的写入操作的结果对于这些读取操作是可见的。其他结果可能可见也可能不可见。
happen-before 顺序是由线程之间的同步操作顺序以及各个线程中的自然操作顺序引起的。
如果您在 Before
中对一个对象(例如您的 Queue
)进行同步,并对 Thing
及其“子对象”进行所有操作"在这个同步块(synchronized block)内或之前,After
在同一个 Queue
上同步,并在同步块(synchronized block)内或之后读取这些对象,然后所有这些更改 对 After
可见。
关于java - Java 的同步会更新整个缓存,还是只更新我同步的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7220441/