编程语言
首页 > 编程语言> > Java中变量的读写原子性

Java中变量的读写原子性

作者:互联网

这是另一个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执行.

然后,如果无法按上述方式交错原子操作,则意味着在此原子操作(由threadX执行)期间,不允许其他线程Y访问(用于读取或写入)相同的变量i2,因此,其他线程Y不被访问.允许在原子操作期间访问相同的变量,因此确实存在某种形式的阻塞.

我说对了吗?

谢谢…

解决方法:

据我所知,没有原子i1 = i2运算.您可以自动读取一个int,也可以自动写入一个int,但是不能在同一操作中同时执行两个操作.所以i1 = i2是两个不同的原子操作,先读后写.您可以确保没有任何东西会干扰读取操作,因此您在读取i2时不会看到对i2的部分更新,并且可以保证没有任何东西会干扰对i1的写入,但是无法保证这两者之间不会发生任何事情.原子操作.

可以说线程t1将要做:

i2 = 10
i1 = i2

线程t2将要做:

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

您可以保证t1最终将为i1分配10或18,但是您不知道哪个.但是,可以保证它不能是任何其他值,因为对i2的读取和对i1的写入都是原子的,因此在修改i2时,最终看不到i2的某些位.同样,保证t2可打印10、18或7,而不能打印其他任何东西.但是,如果没有同步,就无法知道将要打印的那三个值中的哪一个.

标签:multithreading,atomicity,java
来源: https://codeday.me/bug/20191026/1934418.html