gpt4 book ai didi

Java 可变循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:22:08 27 4
gpt4 key购买 nike

我正在处理某人的代码并遇到了类似的代码:

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

someVolatileMember 定义如下:

private volatile int someVolatileMember;

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

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

我的问题是:

  • 只是确认线程A做的迭代次数可以是如果线程 B 修改,则在 for 循环处于 Activity 状态时更改someVolatileMember
  • 本地非 volatile 副本足以确保线程 A 运行循环 线程 B 不能改变迭代

最佳答案

你的理解是正确的:

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

    The Java programming language provides a second mechanism, volatile fields, that is more convenient than locking for some purposes.

    A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).

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

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

关于Java 可变循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52743838/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com