优先选择同步而不是易失性

2024-02-10

我读过这个answer https://stackoverflow.com/a/3488771/2786156最后写下以下内容:

任何你能用 易失性 实现的事情都可以用同步完成,但是 反之则不然。

目前还不清楚。JLS 8.3.1.4 https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.1.4定义易失性字段如下:

字段可以被声明为易失性的,在这种情况下,Java 内存模型 确保所有线程看到变量的一致值 (第 17.4 节)。

因此,易失性字段与内存可见性有关。另外,据我从我引用的答案中得到的,对易失性字段的读取和写入是同步的。

同步又保证了只有一个线程可以访问同步块。据我所知,它与内存可见性无关。我错过了什么?


事实上,同步也与内存可见性有关,因为 JVM 添加了一个记忆障碍在同步块的出口处。这确保了同步块中线程的写入结果对于其他线程的读取是可见的once第一个线程已退出同步块。

Note :根据 @PaŭloEbermann 的评论,如果另一个线程通过读内存屏障(例如通过进入同步块),它们的本地缓存不会失效,因此它们可能会读取旧值。

同步块的退出是发生在之前在本文档中:http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

寻找这些摘录:

保证一个线程写入的结果对其他线程可见 仅当写操作发生之前才由另一个线程读取 读操作。

and

监视器的解锁(同步块或方法退出) 发生在每个后续锁(同步块或方法)之前 同一监视器的条目)。并且因为发生在关系之前 是可传递的,解锁之前线程的所有操作 发生在任何线程锁定之后的所有操作之前 监视器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优先选择同步而不是易失性 的相关文章

随机推荐