gpt4 book ai didi

java - 使 POJO 线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:56 26 4
gpt4 key购买 nike

这是类:

@NotThreadSafe
public class MutableInteger {
private int value;
public int get() { return value;}
public void set(int value) { this.value = value;}
}

这是我提出的后置条件:get() 返回的值等于 set() 设置的值或 0。

很容易看出上述后置条件并不总是成立。以两个线程 A 和 B 为例。假设 A 将 value 设置为 5,然后 B 将其设置为 8。在线程 A 中执行 get() 会返回 8。它应该返回 5。这是一个简单的竞争条件情况。

如何使此类线程安全?在 Java:并发实践 一书中,作者保护了同一对象上的 value 和两种方法。我不明白这对比赛条件有何帮助。首先,set() 不是复合 Action 。那么,为什么我们需要同步它呢?即使在那之后,竞争条件也不会消失。一旦一个线程从 set() 方法中退出,一旦锁被释放,另一个线程就可以获取锁并设置一个新值。在初始线程中执行 get() 将返回新值,违反后置条件。

(我知道作者正在保护 get())的可见性。但我不确定它是如何消除竞争条件的。

最佳答案

First of all, set() is not a compound action. So, why do we need to synchronise it?

你不是在同步 set() 本身,你是在同步 get()set() 针对同一对象的方法(假设您使这两个方法同步。)

如果您没有这样做,并且value变量没有被标记为volatile,那么您不能保证线程会看到正确的值因为每线程缓存。 (线程 a 可以将其更新为 5,然后线程 b 仍然可能看到 8 ,即使在线程 a 更新它之后也是如此。 这就是在这种情况下缺乏线程安全的意思。)

所有引用分配都是原子的,你是对的,所以在这种情况下不用担心引用损坏。

And even after that, the race condition does not disappear. As soon as the lock is released once a thread exits from the set() method, another thread can aquire the lock and set a new value.

新线程设置新值(或新代码设置新值)在线程安全方面根本不是问题 - 这是设计和预期的。问题是结果是否不一致,或者特别是多个线程是否能够同时查看处于不一致状态的对象。

关于java - 使 POJO 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53769141/

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