
问题?
并发修改异常
并发环境下,遍历的过程中不容许更新操作(增删改)
如:
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 包