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

标签 java concurrency synchronization parallel-processing monitor

如果我在同步方法或同步块(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/

相关文章:

java - 无法解析对 AWS Lambda 中值 : ${akka. stream.materializer} 的替换

java - 具有数字常量的枚举类型

java - 为什么 CopyOnWriteArrayList 使用额外的内存进行设置、添加操作

java - 如何将不同的并发策略分配给同一个(持久性)实体?

objective-c - 在 Objective-C 中 @synchronized 如何锁定/解锁?

java - 线程同步问题(java中)

java - 如何使用 Play 防止浏览器缓存?

java - 如何避免 hibernate 中的字符串成员?

swift - Alamofire 并发与常规或建议方法的优缺点

java - 减少 Java 中同步块(synchronized block)的范围意外地损坏了我的 ArrayList,为什么会出现这种情况?