并发集合

问题?

并发修改异常
并发环境下,遍历的过程中不容许更新操作(增删改)

如:

package cn.njauit;

import java.util.ArrayList;
import java.util.List;

/** * @author 张文军 * @Description: 并发修改异常 * @Company: njauit.cn * @version: 1.0 * @date 2020/2/122:10 */
public class ConcurrentErrorTest {
    private static List<User> users = new ArrayList<>();

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            users.add(new User("user-" + i, i));
        }

        /** * 在遍历的时候进行删除 */
        for (User user : users) {
            if (user.getName().equals("user-10")) {
                users.remove(user);
            }
        }
    }

}

异常:

Exception in thread "main" java.util.ConcurrentModificationException

ConcurrentCollection

1、 非阻塞式集合:(Non-BlockingCollection 如:ConcurrentLinkedDeque

这类集合也包括添加和移除数据的方法。如果方法不能立即被执行,则返回null或抛出异常,但是调用这个方法的线程不会被阻塞。

  • ConcurrentLinkedQueue 一个基于链接节点的并发 deque无界。并发插入、移除和访问操作安全地执行跨多个线程。一个 ConcurrentLinkedDeque是一个合适的选择,当多个线程共享访问公共收藏。像大多数其他并行采集的实现,这类不允许使用 null元素。

2、阻塞式集合(Blocking Collection):如:LinkedBlockingDeque

这类集合包括添加和移除数据的方法。当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。

  • LinkedBlockingDeque 基于链接节点的可选限定的blocking deque 。
    可选容量绑定构造函数参数用于防止过度扩展。 容量,如果未指定,等于Integer.MAX_VALUE 。 链接节点在每次插入时都会动态创建,除非这样可以使得超出容量。

其他可参考 JDK java.concurrent