gpt4 book ai didi

java - Java : no matter the number of writing threads… it only really matters if the operation is atomic or not中的同步关键字

转载 作者:行者123 更新时间:2023-12-03 13:16:36 25 4
gpt4 key购买 nike

我经常读如下语句:
“当变量将被多个线程读取和写入时,请使用“同步”。
来源:
https://jorosjavajams.wordpress.com/volatile-vs-synchronized/
我不同意这一点,我认为应该通过以下方式进行更改:
“在非原子操作时使用同步”
这是我的演示:
线程1具有以下代码:

valueX = 10;
线程2具有以下代码:
valueX = 5;
不管是否有一个“同步”块,这都没有关系,因为两者中的任何一个都会赢。即使有关键部分,我们也不知道哪个先获得锁定。
在这里,我认为不使用“同步”块是可以的,因为它们是原子操作。
以下是一个非常不同的情况:
线程1具有以下代码:
valueX++;
线程2具有以下代码:
valueX--;
这里我们需要一个“同步”块,因为value++是非原子的,因为它可以写为:
int tmp = valueX;
valueX = tmp + 1;
我的问题是:我说的对吗?如果没有,您能证明我错了吗?

最佳答案

你错了。
同步实现两件事:[互斥] [1]和内存可见性。您说的是原子操作是正确的。但是,通常您不能保证另一个线程将看到写入操作的结果,这是错误的。
根据[Java内存模型] [2],在线程中执行的未同步操作对该线程可见,但对于其他线程则不一定可见。因此,如果两个线程在同一个变量num++上执行num,则不同步,结果可以是num+1num+2,但同步时,结果始终是num+2。这不是因为操作不是原子的,而是因为当一个线程执行增量操作时,无法保证另一线程会看到它的结果。同步保证写入的效果对其他线程可见。
类似的讨论也适用于volatile变量:对volatile的访问通常包括使它们立即对其他线程可见的内存屏障。
[1] https://en.wikipedia.org/wiki/Mutual_exclusion
[2] https://en.wikipedia.org/wiki/Java_memory_model

关于java - Java : no matter the number of writing threads… it only really matters if the operation is atomic or not中的同步关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62664326/

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