1 LinkedList并发异常
package com.example.demo;
import java.util.Iterator;
import java.util.LinkedList;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList(); //双向链表
linkedList.add(11);
linkedList.add(22);
linkedList.add(33);
//nextIndex : 0 next 第一号节点元素
//lastReturned 记录返回值的对象
// private int expectedModCount = modCount; 将记录链表长度发生变化次数的记录值赋值给 期望值 -> 程序在初始化的时候,那么他们一定是相等的
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()){
linkedList.add(10);
System.out.println(iterator.next());
}
System.out.println(linkedList);
}
}
在查询的时候进行插入,报错如下:
因为在linklist初始化的时候,期望值expectedModCount和真实值modCount是一样的,而进行add()方法以后就不一样了。
如下图,只改变了modCount的值。
2 测试并发修改异常
package com.example.demo;
import java.util.LinkedList;
import java.util.ListIterator;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList(); //双向链表
linkedList.add(11);
linkedList.add(22);
linkedList.add(33);
//nextIndex : 0 next 第一号节点元素
//lastReturned 记录返回值的对象
// private int expectedModCount = modCount; 将记录链表长度发生变化次数的记录值赋值给 期望值 -> 程序在初始化的时候,那么他们一定是相等的
ListIterator iterator = linkedList.listIterator();
while (iterator.hasNext()){
//hashNext 遍历链表长度的次数
iterator.add(10);
System.out.println(iterator.next());
}
System.out.println(linkedList);
}
}
结果如下:
这个add方法会对期望值和真实值同时进行修改,所以无异常。