假设我有一个 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/