jdk 5的concurrent包中,添加了几个CopyOnWrite开头的类,包括CopyOnWriteHashMap,CopyOnWriteArrayList,CopyOnWriteArraySet。 copy-on-write模式声明了,为了维护对象的一致性快照,要依靠不可变性(immutability)来消除在协调读取不同的但是相关的属性时需要的同步。对于集合,这意味着如果有大量的读(即 get()
) 和迭代,不必同步操作以照顾偶尔的写(即 add()
)调用。对于新的 CopyOnWriteArrayList
和 CopyOnWriteArraySet
类,所有可变的(mutable)操作都首先取得后台数组的副本,对副本进行更改,然后替换副本。这种做法保证了在遍历自身更改的集合时,永远不会抛出 ConcurrentModificationException
。遍历集合会用原来的集合完成,而在以后的操作中使用更新后的集合。这些新的集合, CopyOnWriteArrayList
和 CopyOnWriteArraySet
,最适合于读操作通常大大超过写操作的情况。
如下所示,集合的使用与它们的非 copy-on-write 替代物完全一样。只是创建集合并在其中加入或者删除元素。即使对象加入到了集合中,原来的 Iterator
也可以进行,继续遍历原来集合中的项。
import java.util.*;
import java.util.concurrent.*;
public class CopyOnWrite {
public static void main(String args[]) {
List list1 = new CopyOnWriteArrayList(Arrays.asList(args));
List list2 = new ArrayList(Arrays.asList(args));
Iterator itor1 = list1.iterator();
Iterator itor2 = list2.iterator();
list1.add("New");
list2.add("New");
try {
printAll(itor1);
} catch (ConcurrentModificationException e) {
System.err.println("Shouldn't get here");
}
try {
printAll(itor2);
} catch (ConcurrentModificationException e) {
System.err.println("Will get here.");
}
}
private static void printAll(Iterator itor) {
while (itor.hasNext()) {
System.out.println(itor.next());
}
}
}
这个示例程序用命令行参数创建 CopyOnWriteArrayList
和 ArrayList
这两个实例。在得到每一个实例的 Iterator
后,分别在其中加入一个元素。当 ArrayList
迭代因一个 ConcurrentModificationException
问题而立即停止时, CopyOnWriteArrayList
迭代可以继续,不会抛出异常,因为原来的集合是在得到 iterator 之后改变的。如果这种行为(比如通知原来一组事件监听器中的所有元素)是您需要的,那么最好使用 copy-on-write 集合。如果不使用的话,就还用原来的,并保证在出现异常时对它进行处理。
[1].驯服 Tiger: 并发集合 http://www.ibm.com/developerworks/cn/java/j-tiger06164/
分享到:
相关推荐
Java分布式应用学习笔记04JDK的并发包的集合总结
包含了java1.6 API的中文工具,能对API进行查找,查看中文描述,对API类里面的结构,构造器,方法,成员变量都能一目了然,并且打包concurrent并发包,助你在java多线程道路上一帆风顺。
JDK 5中文文档PDF文档JDK 5中文文档PDF文档JDK 5中文文档PDF文档JDK 5中文文档PDF文档
沈东良JDK5 API 方便开发者查询察看使用
JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版 标准的API规范文档,谷歌中文翻译 全翻译
第三章 使用 JDK 并发包构建程序第三章使用JDK并发包构建程序 13.13.2原子量23.2.1锁同步法33.2.2比较并交换43.2.3原子变量类63.2
jdk查询文档,常用开发的工具类查询,对于初学者有很大帮助
JDK1.8 API 中文谷歌翻译版 java帮助文档 JDK API java 帮助文档 谷歌翻译 JDK1.8 API 中文 谷歌翻译版 java帮助文档 Java最新帮助文档 本帮助文档是使用谷歌翻译,非人工翻译。准确性不能保证,请与英文版配合使用 ...
jdk中线程安全的集合类.docx
JDK 5 0 zip 欢迎下载 JDK 5 0 zip 欢迎下载 JDK 5 0 zip 欢迎下载
JDK 1.8中文API文档
jdk api 1.8_中文文档 jdk api 1.8_中文文档 jdk api 1.8_中文文档
jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助文档jdk8帮助...
JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...
JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_5_zh_CN(JDK1.5中文帮助文档) JDK_API_1_...
下载后直接去本机jdk目录里替换jdk中的src.zip 再打开idea就能看到中文版的源码注释 示例 https://blog.csdn.net/a7459/article/details/106495622
jdk5 win64
jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档 官方直接翻译
jdk5 win7 64位下载jdk5 win7 64位下载jdk5 win7 64位下载
jdk8中文API文档