e.g。我在多线程环境中有静态字段(许多线程使用此变量):
public static int value;
我应该在声明中添加volatile
以建立先发生关系吗?
答案 0 :(得分:3)
实例关联与并发修改正交。
如果您通过多个线程访问静态值,则每个线程都可以拥有本地缓存副本为了避免这种情况,您可以将变量声明为 static volatile ,这将强制线程每次读取全局值
答案 1 :(得分:2)
是的,那是一种做法。另一种方法是仅使用同步方法访问它。
易失性字段是用于在线程之间传递状态的特殊字段。每次读取volatile都会看到任何线程对该volatile的最后一次写入;实际上,它们被程序员指定为字段,由于缓存或重新排序而无法接受看到“陈旧”值的字段。禁止编译器和运行时将它们分配到寄存器中。他们还必须确保在写入之后,将它们从缓存中刷新到主内存,这样它们就可以立即对其他线程可见。类似地,在读取volatile字段之前,必须使高速缓存无效,以便主存储器中的值(而不是本地处理器高速缓存)是所见的值。重新排序对volatile变量的访问还有其他限制。
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile
请注意,除了之前发生过的关系之外,如果您还想要原子性,请阅读此问题的答案:Java: Is there a right way to use static volatile variables?