3、为什么要报这个错?途中出错的地方是ArrayList.java:901定位到该处代码:
.*; /* * @desc java集合中Fast-Fail的测试程序。...* fast-fail解决办法:通过util.concurrent集合包下的相应类去处理,则不会产生fast-fail事件。...ArrayList会产生fast-fail事件,而CopyOnWriteArrayList不会产生fast-fail事件。...* (01) 使用ArrayList时,会产生fast-fail事件,抛出ConcurrentModificationException异常;定义如下: * private...static List list = new ArrayList(); * (02) 使用时CopyOnWriteArrayList,不会产生fast-fail事件
key, V value){} public synchronized V put(K key, V value) { 3、另一个区别是两个迭代器不同:HashMap的迭代器是(Iterator)是fast-fail...迭代器,而Hashtable的迭代器(Enumeration)不是fast-fail迭代器;所以当其他线程改变HashMap的结构(增加或者删除)就会抛出CME(ConcurrentModification
CopyOnWriteArrayList简介 熟悉Java开发的童鞋都知道ArrayList是线程不安全的,在多线程的环境下可能会发生fast-fail机制,抛出ConcurrentModificationException...环境 本源码基于JDK1.8 fast-fail机制 fast-fail是一种快速失败机制,在容器中有广泛的运用,我们都知道ArrayList是线程不安全的,当多个线程同时对集合进行结构上的修改时,就可能会产生...fast-fail机制。
minCapacity 个元素 public synchronized void ensureCapacity(int minCapacity) ; Vector ---- 实现: 数组 线程安全: 是;fast-fail...retainAll(Collection) O(n) O(n) O(n) indexOf(Object) O(n) O(1) O(n) Stack ---- 实现: Vector 线程安全: 是;fast-fail...pop() O(1) O(1) O(1) peek() O(1) O(1) O(1) empty() O(1) O(1) O(1) LinkedList ---- 实现: 双指针链表 线程安全:否;fast-fail...hash; this.next = next; } } 实现: 开散列 + WeakReference + ReferenceQueue 线程安全: 否; fast-fail...实现: 闭散列;没有用Map.Entry类,数组偶数位置放 key,奇数位置放 value 线程安全: 否;fast-fail保护 是否支持null:是 容量:默认初始容量32;加载因子2/3;容量一定为
简介 ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModificationException...下面主要以下几个方面学习CopyOnWriteArrayList:1)什么是fast-fail机制 2)COW的设计思想 3)add方法实现原理 4)get方法实现原理 5)CopyOnWrite的缺点...原理分析 fast-fail机制 fail-fast是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。
ConcurrentLinkedQueue的一些需要注意的点: 1.不允许存储null值,否则抛出NPE 2.Iterator遍历时数据的弱一致性 3.size方法没有绝对的实时性 4.没有fast-fail...(v == null) throw new NullPointerException(); } 2.Iterator遍历时数据的弱一致性 3.size方法没有绝对的实时性 4.没有fast-fail...机制 前两个问题都是由于ConcurrentLinkedQueue的异步特性造成的,在遍历时无法保证队列不会被其他线程修改.并且ConcurrentLinkedQueue没有fast-fail机制,即在遍历队列时
JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,Hashtable也是使用fast-fail的。
大彬:如果使用foreach删除元素的话,会导致快速失败(fast-fail)问题,可以使用迭代器的 remove() 方法,避免fast-fail问题。
在Java Collection Framework的Iterator实现中大多数是fast-fail方式的,而支持并发的容器数据结构则没有这个限制。...= expectedModCount的情况,从而抛出异常fast-fail。...Iterator { Entry next; // next entry to return int expectedModCount; // For fast-fail...而与HashMap不同的地方,ConcurrentHashMap的Iterator并不是fast-fail的,它并没有判断modCount;除此之外还应该看到它对nextEntry的处理,在advance
1.迭代器的 fast-fail 机制 我们知道,AbstractList 默认是不提供线程安全的保证的,但是为了尽可能的避免并发修改对迭代带来的影响,JDK 引入一种 fast-fail 的机制,即如果检测的发生并发修改...= expectedModCount) throw new ConcurrentModificationException(); } } 结合代码,我们就不难理解这个 fast-fail...ListItr 继承了 Itr ,因此他们都有一样的 fast-fail机制。...值得一提的是,对于启用了 fast-fail 机制的实现类,只有使用迭代器才能边遍历边删除,原因也是因为并发修改检测: 2.Itr 迭代器 现在,回到 Itr 的代码上: private class Itr...AbstractList 引入了并发修改下 fast-fail 的机制,在内部维护一个成员变量 modelCount,默认为零,每次结构性修改都会让其+1。
E> { Entry next; // next entry to return int expectedModCount; // For fast-fail
(3)comparator,比较器,在优先级队列中,也有两种方式比较元素,一种是元素的自然顺序,一种是通过比较器来比较; (4)modCount,修改次数,有这个属性表示PriorityQueue也是fast-fail...的; 不知道fast-fail的,查看这篇文章的彩蛋部分:【死磕 java集合之HashSet源码分析】。
fast-fail是Java集合的一种错误机制。当多个线程对同一个集合进行操作时,就有可能会产生fast-fail事件。...此时modCount(记录集合操作过程的修改次数)会加1,不等于expectedModCount,那么线程a访问集合的时候,就会抛出ConcurrentModificationException,产生fast-fail...边遍历边修改集合也会产生fast-fail事件。 解决方法: 使用Colletions.synchronizedList()方法或在修改集合内容的地方加上synchronized。
当多个线程对同一个集合进行操作时,就有可能会产生 fast-fail 事件。...modCount(记录集合操作过程的修改次数)会加 1,不等于 expectedModCount,那么线程 A 访问集合的时候,就会抛出 Concurrent Modification Exception,产生 fast-fail...边遍历边修改集合也会产生 fast-fail 事件。 解决方法: 使用 Colletions.synchronizedList 方法或在修改集合内容的地方加上 synchronized。
这叫fast-fail(快速失败,失败越快,错误越小) ii)HashMap 马克-to-win:和Hashtable相比,HashMap是线程不安全的。
主要方法 下面的方法后面标有数字的就是表示重载方法 ctor-3 get set add-2 remove-2 clear addAll write/readObject fast-fail 机制...= expectedModCount) { throw new ConcurrentModificationException(); } } 2. fast-fail... 所谓的 fast-fail 就是在我们进行 iterator 遍历的时候不允许调用 Collection 接口的方法进行对容器修改,否则就会抛异常。
领取专属 10元无门槛券
手把手带您无忧上云