`

jdk 5并发包中CopyOnWrite类的用法

阅读更多

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的并发包的集合总结

    Java分布式应用学习笔记04JDK的并发包的集合总结

    jdk1.6API中文+concurrent并发包API介绍.zip

    包含了java1.6 API的中文工具,能对API进行查找,查看中文描述,对API类里面的结构,构造器,方法,成员变量都能一目了然,并且打包concurrent并发包,助你在java多线程道路上一帆风顺。

    JDK 5中文文档PDF文档JDK 5中文文档PDF文档

    Java Development Kit (JDK) 5是Java编程语言的一个重要版本,由Sun Microsystems(后被Oracle公司...阅读JDK 5中文文档,可以深入了解这些特性的具体用法和背后的设计理念,对于学习和理解Java编程具有重要的价值。

    jdk5.zip

    JDK 5还引入了可变参数(Varargs)功能,允许在方法签名中使用省略号(...)来表示可变数量的参数。这使得开发者可以方便地创建接受任意数量相同类型参数的方法。 在并发编程方面,JDK 5添加了java.util.concurrent...

    JDK1.8中文文档 JDK1.8中文 jkd8中文文档 JDK中文版

    再者,JDK1.8引入了默认方法(Default Methods)到接口中,这是一个重大的设计改变。默认方法允许在接口中定义具有实现的方法,这样可以在不破坏已有实现的情况下为接口添加新的功能。这在升级API时尤其有用,避免了...

    Jdk11中文帮助文档

    5. **改进的变量声明**:JDK 11允许在`switch`语句中使用`yield`语句返回值,并且可以使用`var`关键字声明并初始化局部变量,简化了代码。 6. **删除了部分过时的API**:为了保持JDK的清洁性,一些不再推荐使用的...

    Java并发编程实践-03章-使用JDK并发包构建程序1

    JDK并发包(java.util.concurrent)提供了丰富的工具和类,使得开发人员能够有效地管理和控制并发执行的任务。本章将深入探讨如何使用JDK并发包来构建程序。 **3.1 java.util.concurrent概述** `java.util....

    JDK5 API 中文

    沈东良JDK5 API 方便开发者查询察看使用

    jdk 查看类和方法

    本文将深入探讨如何使用JDK来查看类和方法,以帮助开发者更好地理解和操作Java代码。 首先,JDK提供了一个名为`javadoc`的工具,用于生成Java源代码的API文档。通过`javadoc`,我们可以查看任何公开的类、接口、...

    jdk5 webservice demo

    【标题】"JDK5 WebService Demo"是一个基于Java开发的Web服务示例项目,它展示了在JDK 5.0版本中如何实现和使用Web服务。Web服务是一种通过网络进行通信的应用程序接口(API),它允许不同系统之间的数据交换。JDK 5...

    jdk5_64.zip

    JDK5允许在方法签名中使用`...`来表示可变参数,比如`public void print(String... args)`。这种方式允许传入任意数量的字符串,提高了方法的灵活性。 七、注解(Annotations) 注解是JDK5引入的一种元数据,提供...

    JDK 1.8中文API文档

    **JDK 1.8中文API文档** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件包,其中包含Java运行时...通过查阅该文档,开发者可以快速找到所需的类和方法,理解其功能和用法,提升编程效率。

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    5. **默认方法**:在接口中引入了默认方法,允许接口定义实现的方法,这为不破坏向后兼容性添加新功能提供了可能。例如,`java.util.Collection`接口添加了`forEach()`方法。 6. **Optional类**:`Optional`类是...

    jdk8中文手册

    Lambda表达式可以被用作方法参数,可以实现接口中的单个抽象方法,简化了匿名内部类的使用。例如,`Function`、`Predicate` 和 `Consumer` 接口经常与Lambda一起使用。 2. **默认方法** 为了支持Lambda表达式,...

    java jdk 5学习笔记

    Java JDK 5是Java开发工具集的...在"java jdk 5学习笔记"中,你可能会找到这些特性的详细使用示例和实践教程,帮助你深入理解和应用这些知识。通过学习和实践,你可以提升自己的Java编程技能,更好地应对各种开发场景。

    JDK 5.0.zip

    安装这个版本的JDK后,开发者可以体验到上述的新特性,并在项目中使用它们来提升代码质量。需要注意的是,随着Java的不断更新,JDK 5.0已不再维护,对于新项目建议使用更高版本的JDK以获得最新的功能和安全修复。

    jdk5 win7 64位

    - **泛型(Generics)**:泛型允许在类、接口和方法中使用类型参数,提高了代码的类型安全性和重用性。 - **枚举(Enums)**:枚举是一种预定义常量的类型,增强了枚举类型的使用,使其更像一种类。 - **自动装箱...

    jdk8中文API文档

    JDK 8允许在接口中定义私有方法和静态方法,增强了接口的功能,使其可以包含辅助方法,而不会污染实现类的命名空间。 8. **类型推断的改进**: 类型推断的增强使得在泛型方法调用中可以省略类型参数,编译器会...

    jdk_8中文文档

    2. **方法引用和构造器引用**:除了lambda表达式,JDK 8还支持方法引用和构造器引用,可以直接引用已有方法或类的构造器,减少了代码量并提高了可读性。 3. **默认方法**:在接口中可以定义默认方法,允许接口扩展...

    jdk9中文API文档

    Stream API 在 JDK 9 中得到了扩展,新增了 `takeWhile()` 和 `dropWhile()` 方法,它们可以根据条件过滤流中的元素。 **6. 链接服务(Link Service)** JDK 9 提供了一个链接服务,允许模块在运行时动态发现和使用...

Global site tag (gtag.js) - Google Analytics