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/
分享到:
相关推荐
包含了java1.6 API的中文工具,能对API进行查找,查看中文描述,对API类里面的结构,构造器,方法,成员变量都能一目了然,并且打包concurrent并发包,助你在java多线程道路上一帆风顺。
再者,JDK1.8引入了默认方法(Default Methods)到接口中,这是一个重大的设计改变。默认方法允许在接口中定义具有实现的方法,这样可以在不破坏已有实现的情况下为接口添加新的功能。这在升级API时尤其有用,避免了...
JDK 5还引入了可变参数(Varargs)功能,允许在方法签名中使用省略号(...)来表示可变数量的参数。这使得开发者可以方便地创建接受任意数量相同类型参数的方法。 在并发编程方面,JDK 5添加了java.util.concurrent...
5. **改进的变量声明**:JDK 11允许在`switch`语句中使用`yield`语句返回值,并且可以使用`var`关键字声明并初始化局部变量,简化了代码。 6. **删除了部分过时的API**:为了保持JDK的清洁性,一些不再推荐使用的...
JDK并发包(java.util.concurrent)提供了丰富的工具和类,使得开发人员能够有效地管理和控制并发执行的任务。本章将深入探讨如何使用JDK并发包来构建程序。 **3.1 java.util.concurrent概述** `java.util....
本文将深入探讨如何使用JDK来查看类和方法,以帮助开发者更好地理解和操作Java代码。 首先,JDK提供了一个名为`javadoc`的工具,用于生成Java源代码的API文档。通过`javadoc`,我们可以查看任何公开的类、接口、...
【标题】"JDK5 WebService Demo"是一个基于Java开发的Web服务示例项目,它展示了在JDK 5.0版本中如何实现和使用Web服务。Web服务是一种通过网络进行通信的应用程序接口(API),它允许不同系统之间的数据交换。JDK 5...
JDK5允许在方法签名中使用`...`来表示可变参数,比如`public void print(String... args)`。这种方式允许传入任意数量的字符串,提高了方法的灵活性。 七、注解(Annotations) 注解是JDK5引入的一种元数据,提供...
**JDK 1.8 API 中文 CHM** 是...通过查阅JDK 1.8中文CHM文档,开发者可以深入了解每个类、接口和方法的具体用法,以及它们在实际项目中的应用,从而提升开发效率和代码质量。这个文档是Java开发者不可或缺的参考工具。
Java Development Kit (JDK) 5是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司...阅读JDK 5中文文档,可以深入了解这些特性的具体用法和背后的设计理念,对于学习和理解Java编程具有重要的价值。
Lambda表达式可以被用作方法参数,可以实现接口中的单个抽象方法,简化了匿名内部类的使用。例如,`Function`、`Predicate` 和 `Consumer` 接口经常与Lambda一起使用。 2. **默认方法** 为了支持Lambda表达式,...
**JDK 1.8中文API文档** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件包,其中包含Java运行时...通过查阅该文档,开发者可以快速找到所需的类和方法,理解其功能和用法,提升编程效率。
5. **默认方法**:在接口中引入了默认方法,允许接口定义实现的方法,这为不破坏向后兼容性添加新功能提供了可能。例如,`java.util.Collection`接口添加了`forEach()`方法。 6. **Optional类**:`Optional`类是...
"方便已义中文方式浏览jdk中的说明"强调了这个文档是中文翻译版,使得开发者能够更轻松地理解JDK中的各种类、接口、方法和概念,降低了学习和使用的难度。 **标签解析:** "范文/模板/素材" 这个标签可能是指这个...
安装这个版本的JDK后,开发者可以体验到上述的新特性,并在项目中使用它们来提升代码质量。需要注意的是,随着Java的不断更新,JDK 5.0已不再维护,对于新项目建议使用更高版本的JDK以获得最新的功能和安全修复。
2. **方法引用和构造器引用**:除了lambda表达式,JDK 8还支持方法引用和构造器引用,可以直接引用已有方法或类的构造器,减少了代码量并提高了可读性。 3. **默认方法**:在接口中可以定义默认方法,允许接口扩展...
- **泛型(Generics)**:泛型允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和重用性。 - **枚举(Enums)**:枚举是一种预定义常量的类型,增强了枚举类型的使用,使其更像一种类。 - **自动装箱...
这些知识点只是JDK 1.8 API中文文档中的一部分,实际文档中会涵盖Java SE平台的所有类和接口,以及它们的用法、构造、方法和属性。通过这份文档,开发者可以深入理解JDK 1.8的功能和用法,提升编程效率和代码质量。
10. **类型注解**:JDK8扩展了注解的使用范围,允许在类型声明(包括类、接口、方法和字段)上使用注解,增强了代码的元数据信息。 以上只是JDK8 API中一部分重要的更新和特性,实际的文档包含更多内容,如反射、...