相关疑难解决方法(0)

从并发修改的ConcurrentSkipListSet创建TreeSet的异常

通常,并发集合可以安全迭代; 根据Javadoc的说法:'迭代器是弱一致的,在迭代器创建时或之后的某个时刻返回反映集合状态的元素.它们不会抛出ConcurrentModificationException,并且可能与其他操作同时进行.但是,考虑一下:

import java.util.Random;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentSkipListSet;

public class ConcurrencyProblem {
    private static volatile boolean modifierIsAlive = true;

    public static void main(String[] args) {
        final ConcurrentSkipListSet<Integer> concurrentSet = new ConcurrentSkipListSet<>();
        Thread modifier = new Thread() {
            private final Random randomGenerator = new Random();

            public void run() {

                while (modifierIsAlive) {
                    concurrentSet.add(randomGenerator.nextInt(1000));
                    concurrentSet.remove(randomGenerator.nextInt(1000));
                }
            };
        };
        modifier.start();
        int sum = 0;
        while (modifierIsAlive) {
            try {
                TreeSet<Integer> sortedCopy = new TreeSet<>(concurrentSet);
                // make sure the copy operation is not eliminated …
Run Code Online (Sandbox Code Playgroud)

java collections concurrency

18
推荐指数
1
解决办法
638
查看次数

ConcurrentHashMap返回一个弱一致的迭代器,为什么我们应该使用它呢?

我正在阅读Java Concurrecny这本书.在第85页的第5.2.1节中,它讨论了ConcurrentHashMap及其优点.然而,在一个部分中,书籍声称

ConcurrentHashMap返回的迭代器非常一致.这意味着这个迭代器可以容忍并发修改,遍历构造迭代器时存在的元素,并且可以(但不保证)反映迭代器构造后对集合的修改.

从我理解为什么并发程序中的整个同步点是允许线程以一致的方式访问共享资源,而ConcurrentHashMap并没有真正实现这一点.那么为什么要使用呢?

java concurrency concurrenthashmap concurrent-programming

9
推荐指数
1
解决办法
3463
查看次数