我正在学习Java收集框架(而不是并发收集框架),并且我知道有些Collection实现是线程安全的,而有些则不是。
在我阅读的大多数材料中,所有提到的xyz
都是线程安全的和abc
不是线程安全的。
但是,根据哪个决定是否要确保给定的集合类型(例如List,Set,Queue,甚至在Map ..中)线程安全,是基于什么逻辑呢?
我的问题是关于“传统”收集框架的,而不是关于并发收集框架的。
任何理解这一点的投入都会有很大的帮助。
线程安全带来了开销(尽管在现代VM中,开销比设计收集框架时要低得多)。因此,除非特别要求,否则收集不是线程安全的,但JDK1.1收集除外-设计它们时,其理念更像是“以牺牲一些性能为代价,让错误的余地很小”。
Java API的发展分为几个阶段。
在Java 1.1版中,我们拥有数据结构Vector
和Hashtable
。它们完全同步,从而提供了一定级别的线程安全性。
在Java版本1.2中,引入了collections框架。基本藏品都不是线程安全的(他们不同步的任何操作): ,ArrayList
,,和实现。LinkedList
HashMap
TreeMap
Set
但是你可以通过调用获得同步的版本Collections.synchronizedMap
,Collections.synchronizedList
等等。
在Java 1.5版中,java.util.concurrent
引入了该框架。它们包含专门为多线程使用而结构化的数据。这些提供了一定程度的线程安全性。
请注意,即使使用同步集合,也可以引入数据竞争。这仅意味着您无法破坏集合的内部结构(集合的所有不变量将被保留)
例如,如果您有一个两步过程,首先检查集合中是否包含某些元素,然后在第二步中插入该元素。如果您没有为这两个步骤提供自己的同步,那么如果两个线程同时执行此操作,则可以将元素添加两次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句