gpt4 book ai didi

java - 哈希表:为什么get方法是同步的?

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

我知道 Hashtable 是同步的,但为什么它的 get() 方法是同步的?

难道只有读方法吗?

最佳答案

如果读取不同步,则可以在读取执行期间修改哈希表。可以添加新元素,底层数组可能变得太小,可以用更大的数组替换等。如果没有顺序执行,很难处理这些情况。

但是,即使get 不会在Hashtable 被另一个线程修改时崩溃,synchronized 关键字还有另一个重要方面,即缓存同步。让我们使用一个简化的例子:

class Flag {
bool value;

bool get() { return value; } // WARNING: not synchronized
synchronized void set(bool value) { this->value = value; }
}

set 是同步的,但 get 不是。如果两个线程 A 和 B 同时读写这个类会怎样?

1. A calls read
2. B calls set
3. A calls read

第3步是否保证A看到线程B的修改?

不,它不是,因为 A 可能运行在不同的核心上,它使用单独的缓存,旧值仍然存在。因此,我们必须强制 B 将内存与其他内核通信,并强制 A 获取新数据。

我们如何执行它?每次,一个线程进入和离开一个同步块(synchronized block),一个隐式的memory barrier。被执行。内存屏障强制更新缓存。但是要求写者和读者都必须执行内存屏障。否则,信息将无法正确传达。

在我们的示例中,线程 B 已经使用了同步方法 set,因此它的数据修改在该方法的末尾进行通信。但是,A 并没有看到修改后的数据。解决办法是让get同步,所以强制获取更新后的数据。

关于java - 哈希表:为什么get方法是同步的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14310350/

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