首页 > 解决方案 > Java 易失性循环

问题描述

我正在研究某人的代码,并遇到了与此类似的情况:

for (int i = 0; i < someVolatileMember; i++) {
    // Removed for SO
}

wheresomeVolatileMember是这样定义的:

private volatile int someVolatileMember;

如果某个线程 A 正在运行 for 循环,而另一个线程 B 写入,someVolatileMember那么我假设在线程 A 运行循环时要执行的迭代次数会改变,这不是很好。我认为这会解决它:

final int someLocalVar = someVolatileMember;
for (int i = 0; i < someLocalVar; i++) {
    // Removed for SO
}

我的问题是

标签: javavolatile

解决方案


你的理解是正确的:

  1. 根据Java Language Specificationvolatile字段的语义确保在不同线程之间完成更新后看到的值之间的一致性:

    Java 编程语言提供了第二种机制,volatile即字段,在某些情况下它比锁定更方便。

    可以声明一个字段volatile,在这种情况下,Java 内存模型确保所有线程都看到变量的一致值(第 17.4 节)。

    请注意,即使没有volatile修饰符,循环计数也可能会根据许多因素而变化。

  2. 一旦final分配了变量,它的值就永远不会改变,因此循环计数不会改变。


推荐阅读