Java并发框架在包java.util.package中提供了接口和类。接口中包含List、Set和Map;类包含了ArrayList、TreeSet和HashMap。
- ArrayList、TreeSet、HashMap和其它的类都继承了这些类接口,但是它们是不安全的线程。然而,你可以让它们在使用是安全的线程,通过使用java.util.Collection类的同步擦除方法。例如,你可以通过使用Arraylist去实例化Collections.synchronizedList()去包含一个安全线程的变量ArrayList。
- 尽管它们在多线程的环境中需要简单的代码,但它们在安全集合中也存在以下问题:
- 在遍历集合之前,它可能需要请求一个锁,因为它在遍历期间可能被其它线程修改。如果锁不能被请求和遍历时被修改,它更有可能抛出java.util.ConcurrentModificationException。这个导致的因为是因为集合框架(Collections Framework)类会返回快速失败的迭代器。在遍历期间集合中的参数被修改,那么迭代器将会抛出ConcurrentModificationException.快速失败的迭代器对于当前应用会带来不便。
- 在应用中可能会遭受同步集合在多线程中频繁地被调用。这种性能问题最终会影响程序的扩展性应用。
- 并发工具通过包含同步集合来解决这些问题,这些并发应用和高可扩展和集合导向型,是储存在java.util.concurret的包。这个集合导向的类会返回弱一致性的迭代器。这个迭代器包含下面的属性:
- 一个元素开始后,但尚未返回通过迭代器的next()方法不会返回。
- 一个元素添加后可能会或可能不会返回。
- 在迭代过程中,无论在迭代期间对集合进行更改,任何元素都不会多次返回。
- 下面列表中提供了面向并发集合的简单例子,你可以在包java.util.concurrent中找到。
- BlockingQueue是java.util.Queue的子接口,在检索元素之前没有足够的空间,那么将会处于等待的阻塞状态;或者在储存一个元素时,等待空间变得可用。每一个ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue和SynchronousQueue的类应用都是直接继承的。LinkedBlockDeque和LinkedTransferQueue的类应用接口通过BlockingQueue的子接口使用。
- ConcurrentMap是java.util.Map的子接口,在这个接口中声明putIfAbsent()、remove()和replace的方法。ConcurrentHashMap类(与同步java.util.HashMap相似)、ConcurrentSkipListMap类和ConcurrentNavigableMap类应用这个接口。