java - 我应该使用什么作为集合的内存屏障?

标签 java multithreading concurrency memory-barriers memory-fences

假设我有一个 Java ArrayList,它显然不能是 volatile 变量( volatile 的含义是:它的所有内部变量是 volatile ),并且希望在第二个线程中查看其最新状态,因为我可以确定第二个线程是在第一个线程结束之后执行的(第一个线程可能已修改 ArrayList 实例)。

使用 Memory Barrier这应该很容易。但是我如何构建这样一个影响 ArrayList 实例的所有内部成员变量/状态的内存屏障呢?我知道同步是一个选项,但我不知道应该在哪个对象上同步才能达到预期的效果。

是否有关于此问题的官方引用资料,定义最佳实践?

在我看来,实现内存屏障的最直接方法是调用类似 fullFence() 的内容。 。但似乎这不是推荐的方式;-)

最佳答案

只要在读写时对同一个对象进行同步,就可以保证一致性。我建议选择 Java Concurrency In Practice 来深入了解并发性。

在您的情况下,线程结束会提供内存屏障,因此读取第一个线程可能已修改的任何值应该是安全的。请参阅https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html .

The final action in a thread T1 synchronizes-with any action in another thread T2 that detects that T1 has terminated.

T2 may accomplish this by calling T1.isAlive() or T1.join().

关于java - 我应该使用什么作为集合的内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37056313/

相关文章:

java - 通过PreparedStatement更改受更新影响的列

javascript - Web Worker 消耗大量内存

java - 暂停/恢复线程中的任意计算

java - 线程池中的多个线程在同一个List中写入数据

c# - 有没有办法将 ConcurrentDictionary.TryUpdate 与 lambda 表达式一起使用?

java - 根据 Firebase 的最新日期将数据排序到 RecyclerView

java - 多态性和基于实例的switch case

java - 尝试解决 SSLHandshakeException 时获取 SocketTimeoutException

java - 同步集合与同步方法?

java - AsyncTask 卡住其线程和 UI 线程