【问题标题】:Should I specify shared static variable as volatile?我应该将共享静态变量指定为 volatile 吗?
【发布时间】:2013-02-26 10:03:19
【问题描述】:

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

public static int value;

我应该在声明中添加volatile 以建立happens-before 关系吗?

【问题讨论】:

标签: java concurrency


【解决方案1】:

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

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

【讨论】:

  • 你确定不同的线程可以缓存静态变量的值吗?
  • @Lies:是的,TheWhiteRabbit 是绝对正确的。如果他不是 volatile 将完全没用(除了 double 和 long 变量),因为它的唯一作用就是确保发生之前的关系,即确保线程看不到过时的缓存值。跨度>
【解决方案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?

【讨论】:

  • @giorashc:这取决于您在访问它的方法中所做的事情。简单地做value++ 会导致同步访问和非同步访问之间的不同行为,但不稳定。
猜你喜欢
  • 2013-02-24
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2021-06-03
  • 2011-03-15
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多