参考资料:
首先看一下会出现 java.util.ConcurrentModificationException 的代码:
package com.tch.test.concurrent; import java.util.ArrayList; import java.util.List; public class ConcurrentTest { private static List<String> list = new ArrayList<String>(); public static void main(String[] args) { list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); for(String s:list){ list.remove(s); } } }
通过Iterator解决这个问题:
package com.tch.test.concurrent; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ConcurrentTest { private static List<String> list = new ArrayList<String>(); // private static List<String> list = new CopyOnWriteArrayList<String>(); public static void main(String[] args) { list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); // for(String s:list){ // list.remove(s); // } Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ iterator.next(); iterator.remove(); } System.out.println(list); } }
下面使用java.util.concurrent的CopyOnWriteArrayList解决这个问题:
package com.tch.test.concurrent; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class ConcurrentTest { // private static List<String> list = new ArrayList<String>(); private static List<String> list = new CopyOnWriteArrayList<String>(); public static void main(String[] args) { list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); for(String s:list){ list.remove(s); } System.out.println(list); } }
其中 在add和remove的时候,会创建一个数组副本。下面是remove的实现:
package com.tch.test.concurrent; import java.util.Arrays; public class CopyOnWriteTest { private static String[] arr = {"1","2","3","4","5","6","7"}; public static void main(String[] args) { String s = "8"; //新建一个临时的数组,存放删除之后的新结果 String[] newArr = new String[arr.length-1]; for(int i=0;i<newArr.length;i++){ //将前n-1个元素中,除了待删除的元素之外其他元素全部存到临时数组newArr中 if(arr[i].equals(s)){ for(int j=i+1;j<arr.length;j++){ newArr[j-1] = arr[j]; } arr = newArr; break; }else{ newArr[i] = arr[i]; } } //如果待删除的元素是最后一个元素,特殊处理 if(arr[arr.length-1].equals(s)){ arr = newArr; } System.out.println(Arrays.asList(arr)); } }
java.util.concurrent ConcurrentLinkedQueue 类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue 接口,该接口定义了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue 和 DelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
花了一段时间辛苦整理的ppt,与大家分享,请提出您的宝贵意见。
java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1) java.util.concurrent系列文章(1)
java并发工具包 java.util.concurrent中文版-带书签版
java.util.concurrent总体概览图。 收取资源分3分。需要的同学可以下载一下。 java.util.concurrent主要包括5个部分executor,colletions,locks,atomic,tools。 该图详细的列举了并发包下面的结构,包含所有接口和...
java并发工具包 java.util.concurrent中文版pdf
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用
Java并发编程工具包java.util.concurrent的UML类结构图 PDF
如何启动:以win7系统为例,最好jdk8 1.打开cmd,cd到jdk的path,本机是:cd C:\Java\jdk6\bin ...java -cp D:\javaConcurrentAnimated.jar vgrazi.concurrent.samples.launcher.ConcurrentExampleLauncher
java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2) java.util.concurrent系列文章(2)
Doug Lea关于jdk里面并发同步器的实现。
主要介绍了java.util.concurrent.ExecutionException 问题解决方法的相关资料,需要的朋友可以参考下
AQS作者Doug lea关于AQS设计、性能的paper,需要了解AQS的设计思想,思路可以参考这篇paper
本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...
java.util.concurrent.ArrayBlockingQueueAPI介绍和简单案例
java.util.concurrent 使用jdk内置的包实现一个线程池的操作