gpt4 book ai didi

java - Java 的同步会更新整个缓存,还是只更新我同步的对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:52:21 25 4
gpt4 key购买 nike

如果我在同步方法或同步块(synchronized block)中访问一个对象,该访问元素中的所有对象是否也同步?

假设有一个对象 Queue 具有同步的 add()take() 方法,接受并分发复杂对象 事物Thing 有很多列表,其中包含其他不同的对象。

现在图像线程 Before 创建 Thing 并将一些现有对象放入 Thing 中,修改其中一些对象等等。 Before 线程将 Thing 添加到 Queue。稍后线程 AfterQueue 中获取 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com