1

例如,我在多线程环境中有静态字段(许多线程使用此变量):

public static int value;

我应该添加volatile声明以建立先发生关系吗?

4

2 回答 2

3

实例关联与并发修改正交。

如果您通过多个线程访问静态值,每个线程都可以拥有它的本地缓存副本为避免这种情况,您可以将变量声明为静态易失性,这将强制线程每次读取全局值

于 2013-02-26T10:07:02.537 回答
2

是的,这将是一种方法。另一种方法是仅使用同步方法访问它。

可变字段是用于在线程之间传递状态的特殊字段。对 volatile 的每次读取都会看到任何线程对该 volatile 的最后一次写入;实际上,它们被程序员指定为由于缓存或重新排序而不能看到“陈旧”值的字段。禁止编译器和运行时在寄存器中分配它们。它们还必须确保在写入之后,它们会从缓存中刷新到主内存,这样它们就可以立即对其他线程可见。类似地,在读取 volatile 字段之前,必须使高速缓存无效,以便主内存中的值,而不是本地处理器高速缓存中的值是可见的。对 volatile 变量的重新排序访问还有其他限制。

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

请注意,如果除了happens-before 关系之外还需要原子性,请阅读此问题的答案:Java: Is there a right way to use static volatile variables?

于 2013-02-26T10:05:45.787 回答