- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看过 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/
我已经看过 SynchronizedList 的用例 - 他们指出在迭代时,即使 SynchronizedList 是线程安全的,我们也应该像这样使用迭代器和同步块(synchronized bloc
假设我有一组从客户端发送到服务器的请求 ID 的哈希集。服务器的响应返回我发送的请求 ID,然后我可以将其从哈希集中删除。这将以多线程方式运行,因此多个线程可以在哈希集中添加和删除 ID。然而,由于生
对 DTO 中 ConcurrentHashSet 的使用有点困惑。此 DTO 一次被多个线程访问。 第一种情况 public class LogDTO { private Set pe
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试本着 ConcurrentDictionary 的精神实现一个 ConcurrentHashSet,所采取的方法是使用内部支持 ConcurrentDictionary 并编写小的委托(de
HashSet 基于 HashMap。 如果我们查看 HashSet实现,一切都在HashMap下管理. 用作 HashMap 的键. 我们知道 HashMap不是线程安全的。这就是为什么我们有 Co
我是一名优秀的程序员,十分优秀!