Java集合框架的线程安全周庆岳Java集合框架是由Java平台标准版1
2(JavaSE1
2)引入的通用数据结构与算法框架
其灵活的面对对象设计受到了广大Java程序员的一致青睐,为Java平台的成熟奠定了坚实的基础
一个集合(也称容器)是指将一组元素组合成一个单元的简单对象
集合用于存储、取回、操作和传递这些聚合的元素
集合框架是指一个统一的用来表示和操作集合的体系结构[Bloch,1999]
最简单的集合如数组、列表和队列等,集合框架最著名的例子如C++标准库(STL)
线程安全不是一个全有或全无的问题,难以对其进行精确的定义
线程安全笼统地讲是指程序在多线程环境下运行时的正确性
Java集合框架的设计者BlochJoshua在他著名的《Java高效编程》一书中对Java线程安全的等级做出了相对精确的定义[Bloch,2001]:非可变、线程安全、条件线程安全、线程兼容和线程不友好
本文将结合上述Bloch关于线程安全等级的定义,对Java集合框架中的集合类进行线程安全性分析,并指出各个集合类在现实的编程环境中需要注意的并发编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行分析
所涉及的集合类不仅包括JavaSE1
2引入的集合类,还包括旧集合类(JavaSE1
2前引入)和新集合类(JavaSE5引入)
从而帮助Java程序员在进行并发编程时更加高效地利用Java集合框架
Java线程安全的等级定义根据Bloch的定义,将线程安全分为五个等级,下面将给出这五个等级的描述和部分示例
1、非可变如果一个类的所有实例对于调用它们的客户端对象总是恒定不变的,而无需外部同步,则称为非可变的
字符串类和整数类都是非可变的,但在集合框架中并没有提供直接的非可变类,而是通过对可变类进行封装而得到非可变类
非可变集合不可修改,因而它可以在各个线程间安全共享而无需额外的同步