gpt4 book ai didi

Java HashTable size() 后跟 value() 在线程中安全吗?

转载 作者:行者123 更新时间:2023-12-01 06:55:52 24 4
gpt4 key购买 nike

我在一个线程中顺序执行以下内容:

int size = hashTable.size();

foreach.... in ... hasTable.values()

做某事

我的问题是 foreach 会被执行 size 次吗? (即使另一个线程同时放置/删除一个元素?

最佳答案

不,HashTable在方法级别上是线程安全的(多个线程可以随时调用任何方法),但不存在跨方法同步。在您的两条指令之间,其他线程可能会添加/删除甚至清除哈希表。

如果您需要保持这样的不变性,请制作一个防御性副本(不必是线程安全的)并在该副本上执行 size()/loop :

Map<K, V> map = null;
synchronized(hashTable) {
map = new java.util.HashMap<>(hashTable);
}
map.size();
for(V v: map.values()) {
//...
}

这里的 for-each 是安全的,并且保证运行 size 次。另外,如评论中所述,您可以在 hashTable 上同步:

synchronized(hashTable) {
int size = hashTable.size();
for(V v: hashTable.values()) {
//...
}
}

但是,这一解决方案意味着一次只有一个线程可以执行循环(如果循环需要一些时间才能完成,这可能会成为瓶颈)。通过防御性副本,每个线程都有自己的副本,并且多个线程可以同时循环。另一方面,如果 hashTable 非常大(复制成本昂贵)但迭代非常快,则此解决方案更好

关于Java HashTable size() 后跟 value() 在线程中安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183291/

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