gpt4 book ai didi

java - Java中最简单易懂的volatile关键字示例

转载 作者:IT老高 更新时间:2023-10-28 13:51:55 24 4
gpt4 key购买 nike

我正在阅读 Java 中的 volatile 关键字并完全理解它的理论部分。

但是,我正在寻找的是一个很好的案例示例,它显示了如果变量不是 volatile 会发生什么情况。

以下代码片段无法按预期工作(取自 here):

class Test extends Thread {

boolean keepRunning = true;

public void run() {
while (keepRunning) {
}

System.out.println("Thread terminated.");
}

public static void main(String[] args) throws InterruptedException {
Test t = new Test();
t.start();
Thread.sleep(1000);
t.keepRunning = false;
System.out.println("keepRunning set to false.");
}
}

理想情况下,如果 keepRunning 不是 volatile,线程应该无限期地继续运行。但是,它确实会在几秒钟后停止。

我有两个基本问题:

  • 谁能举例说明 volatile 吗?不是 JLS 的理论。
  • volatile 是同步的替代品吗?是否实现了原子性?

最佳答案

Volatile --> 保证可见性而不是原子性

同步(锁定)-->保证可见性和原子性(如果做得好)

volatile 不能替代同步

仅当您更新引用而不对其执行一些其他操作时才使用 volatile。

例子:

volatile int i = 0;

public void incrementI(){
i++;
}

如果不使用同步或 AtomicInteger 将不是线程安全的,因为递增是一种复合操作。

Why program does not run indefinitely?

这取决于各种情况。在大多数情况下,JVM 足够聪明,可以刷新内容。

Correct use of volatile讨论了 volatile 的各种可能用途。正确使用 volatile 很棘手,我会说“如果有疑问,请不要使用它”,请改用同步块(synchronized block)。

还有:

可以使用同步块(synchronized block)代替 volatile,但反之则不正确

关于java - Java中最简单易懂的volatile关键字示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17748078/

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