Java易失性循环

asi*_*mes 9 java volatile

我正在研究某人的代码,并且遇到了相同的代码:

for (int i = 0; i < someVolatileMember; i++) {
    // Removed for SO
}
Run Code Online (Sandbox Code Playgroud)

在哪里someVolatileMember定义如下:

private volatile int someVolatileMember;
Run Code Online (Sandbox Code Playgroud)

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

final int someLocalVar = someVolatileMember;
for (int i = 0; i < someLocalVar; i++) {
    // Removed for SO
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 只是为了确认线程A所做的迭代次数可以在for循环活动时更改,如果线程B修改的话 someVolatileMember
  • 本地非易失性副本足以确保当线程A运行循环线程B时不能改变迭代次数

man*_*uti 5

你的理解是正确的:

  1. 根据Java语言规范,volatile字段的语义可确保在不同线程之间完成更新后看到的值之间的一致性:

    Java编程语言提供了第二种机制,volatile即为某些目的比锁定更方便.

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

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

  2. 一旦一个final变量被分配,它的价值是从来没有改变过如此循环计数不会改变.