gpt4 book ai didi

java - Java中变量读写的原子性

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

这是对另一个 question of mine 的跟进.

@templatetypedef 回答了这个问题(感谢),他在回答中写道:

As a note - atomicity does not mean "all other threads will be blocked until the value is ready. It means all other threads will either see the state purely before the operation is done or purely after the operation is done, but nothing else.

我对此感到困惑,原因如下:

它说 here :

Atomic actions cannot be interleaved, so they can be used without fear of thread interference.

我由此推断,这与他写的内容相矛盾。

如果我们有 2 个 int 变量 i1 和 i2,并且我们执行原子操作 i1=i2; 并且此操作由 threadX 执行。

然后,如果原子操作不能如上所示交错,则意味着在此原子操作(由线程 X 执行)期间,不允许其他线程 Y 访问(读取或写入)同一个变量 i2,因此,没有其他线程threadY,被允许在原子操作期间访问同一个变量,因此确实存在某种形式的阻塞。

我做对了吗?

谢谢...

最佳答案

据我所知,没有原子 i1 = i2 操作。您可以原子地读取一个 int,也可以原子地写入一个 int,但是您不能在具有同步的同一操作中同时执行这两项操作。所以 i1 = i2 是两个不同的原子操作,先读后写。您可以保证没有任何内容会交错读取操作,因此您在读取时不会看到对 i2 的部分更新,并且可以保证没有任何内容会交错对 i1 的写入>,但不能保证这两个原子操作之间不会发生任何事情。

假设线程 t1 将要执行的操作:

i2 = 10
i1 = i2

线程 t2 将要做的事情:

i1 = 7
i2 = 18
System.out.println(i1)

可以保证 t1 最终会将 10 或 18 分配给 i1,但您不知道是哪个。但是,可以保证它不能是任何其他值,因为 i2 的读取和 i1 的写入是原子的,因此在修改 i2 时您不会看到它的某些位。类似地,t2 保证打印 10、18 或 7,而不能打印任何其他内容。但是,如果没有同步,就无法知道它将最终打印这 3 个值中的哪一个。

关于java - Java中变量读写的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42723821/

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