gpt4 book ai didi

Java ConcurrentHashSet - 在多线程环境中迭代它

转载 作者:行者123 更新时间:2023-12-01 17:45:19 26 4
gpt4 key购买 nike

我已经看过 SynchronizedList 的用例 - 他们指出在迭代时,即使 SynchronizedList 是线程安全的,我们也应该像这样使用迭代器和同步块(synchronized block) -

    synchronized(myList){
Iterator<Item> iterator = myList.iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next().getMessage());
}
}

如果我使用ConcurrentHashSet(可以在Java 8中使用concurrentHashMap的newKeySet()),在多线程环境中,是否还需要提取迭代器并使用同步块(synchronized block)?我尝试测试它,似乎没有必要,但我可能会遗漏一些东西。

谢谢!

最佳答案

ConcurrentHashMap.newKeySet()返回:

    /**
* Creates a new {@link Set} backed by a ConcurrentHashMap
* from the given type to {@code Boolean.TRUE}.
*
* @param <K> the element type of the returned set
* @return the new set
* @since 1.8
*/
public static <K> KeySetView<K,Boolean> newKeySet() {
return new KeySetView<K,Boolean>
(new ConcurrentHashMap<K,Boolean>(), Boolean.TRUE);
}

如您所见,它由 ConcurrentHashMap 支持。您可以使用返回的实例而无需任何同步。

.iterator()方法返回一个新的 KeyIterator由 map Node<K,V>[] table 支持

因此,如果您在一个特定线程中进行迭代,这意味着您将看到 Node 数组的快照每个节点都处于正确状态 bc Node内部有 volatile 链接,但您看到新元素添加到原始 map 的可能性最低,因为链接迭代器点不是 volatile 的。换句话说,您只是迭代一个数组,无法保证该元素是否仍然存在于原始 map atm 中或其中添加了一些新元素,但您可以看到每个节点的最新状态,bc:

    static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
volatile V val;
volatile Node<K,V> next;

key最终确定

val是不稳定的

关于Java ConcurrentHashSet - 在多线程环境中迭代它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56099744/

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