初探LinkedList线程安全问题
2009-10-28 16:42
295 查看
Java中LinkedList是线程不安全的,那么如果在多线程程序中有多个线程访问LinkedList的话会出现什么问题呢?
抛出ConcurrentModificationException
JDK代码里,ListItr的add(), next(), previous(), remove(), set()方法都会跑出ConcurrentModificationException。
代码中,modCount记录了LinkedList结构被修改的次数。Iterator初始化时,expectedModCount=modCount。任何通过Iterator修改LinkedList结构的行为都会同时更新expectedModCount和modCount,使这两个值相等。通过LinkedList对象修改其结构的方法只更新modCount。所以假设有两个线程A和B。A通过Iterator遍历并修改LinkedList,而B,与此同时,通过对象修改其结构,那么Iterator的相关方法就会抛出异常。这是相对容易发现的由线程竞争造成的错误。
通过LinkedList对象修改其结构
如果两个线程都是通过LinkedList对象修改其结构,会发生什么呢?我们先看一下JDK中LinkedList的数据结构。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/Scholfield/EntryImages/20091028/绘图1.jpg)
这是一个双向循环链表。header的作用就是能快速定位链表的头和尾。
抛出ConcurrentModificationException
JDK代码里,ListItr的add(), next(), previous(), remove(), set()方法都会跑出ConcurrentModificationException。
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
代码中,modCount记录了LinkedList结构被修改的次数。Iterator初始化时,expectedModCount=modCount。任何通过Iterator修改LinkedList结构的行为都会同时更新expectedModCount和modCount,使这两个值相等。通过LinkedList对象修改其结构的方法只更新modCount。所以假设有两个线程A和B。A通过Iterator遍历并修改LinkedList,而B,与此同时,通过对象修改其结构,那么Iterator的相关方法就会抛出异常。这是相对容易发现的由线程竞争造成的错误。
通过LinkedList对象修改其结构
如果两个线程都是通过LinkedList对象修改其结构,会发生什么呢?我们先看一下JDK中LinkedList的数据结构。
![](http://p.blog.csdn.net/images/p_blog_csdn_net/Scholfield/EntryImages/20091028/绘图1.jpg)
这是一个双向循环链表。header的作用就是能快速定位链表的头和尾。
相关文章推荐
- 初探LinkedList线程安全问题
- 初探LinkedList线程安全问题(一)
- 关于ArrayList和LinkedList的索引问题
- Odd Even Linked List问题及解法
- 使用单链表求解约瑟夫环问题 (利用java中的LinkedList)
- Collection容器初探之LinkedList
- Flatten Binary Tree to Linked List问题及解法
- ReverseLinkedList,ReverseLinkedList2,链表反转问题
- [LeetCode] Reverse Linked List I II - 链表翻转问题
- LinkedList基本用法,真得很详细,借鉴了,以后再遇到类似的问题啊,不仅要收集起来博文,更要自己争取写出来!
- LinkedList和ArrayList经常被忽略的问题
- Java 集合 LinkedList 需要知道的几个问题
- java LinkedList中的泛型问题
- Palindrome Linked List问题及解法
- Leetcode之Palindrome Linked List 问题
- 链表的反转问题(Reverse Linked List)
- PAT 1097. Deduplication on a Linked List (25)(链表问题)(链表分段)
- 关于LinkedList和ArrayList的执行效率的问题的区别(测试用例)
- 206. Reverse Linked List(递归法问题)
- Leetcode之Linked List Cycle 问题