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