并发集合

更多内容请关注:

Java快速开发学习

锁清秋

问题?

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

如:

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


文章作者: 张文军
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 张文军 !
评论