gpt4 book ai didi

java - java中的 volatile 和原子操作

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:59:05 29 4
gpt4 key购买 nike

我已经阅读了关于Java中原子操作的文章,但仍有一些疑问需要澄清:

int volatile num;
public void doSomething() {
num = 10; // write operation
System.out.println(num) // read
num = 20; // write
System.out.println(num); // read
}

所以我在 1 个方法上完成了 w-r-w-r 4 个操作,它们是原子操作吗?如果多个线程同时调用 doSomething() 方法会发生什么?

最佳答案

如果没有线程会看到中间状态,则操作是原子操作,即操作将完全完成或根本没有完成。

读取 int 字段是一个原子操作,即一次读取所有 32 位。写入一个 int 字段也是原子的,该字段要么已经完全写入,要么根本没有写入。

但是,方法 doSomething() 不是原子的;一个线程可能会在执行该方法时将 CPU 交给另一个线程,并且该线程可能会看到一些(但不是全部)操作已被执行。

也就是说,如果线程T1和T2都执行了doSomething(),可能会出现以下情况:

T1: num = 10;
T2: num = 10;
T1: System.out.println(num); // prints 10
T1: num = 20;
T1: System.out.println(num); // prints 20
T2: System.out.println(num); // prints 20
T2: num = 20;
T2: System.out.println(num); // prints 20

如果 doSomething() 是同步的,那么它的原子性就可以得到保证,上述情况就不可能发生。

关于java - java中的 volatile 和原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996702/

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