线程安全的集合
Collections集合工具方法
工具类中提供了多个可以获得线程安全集合的方法。
synchronizedCollection(Collection
c) synchronizedList(List
list) synchronizedSet(Set
s) synchronizedMap(Map<K, V> m)
synchronizedSortedSet(SortedSet
s) synchoronizedSortedMap(SortedMap<K, V> m)
有Vector为什么还要用CopyOnWriteArrayList(区别)?
早期版本使用Vector,但是因为其使用synchronized互斥锁,导致效率太低,jdk1.5之后加入CopyOnWriteArrayList,其只有写加了锁,读不加锁,所以写写互斥,读读不互斥。
CopyOnWriteArrayList
线程安全的ArrayList,加强版读写分离
写有锁,读无锁
,读写之间不阻塞,优于读写锁。写入时,先copy一个容器副本,再添加新元素,最后替换引用。
List<String> list = new CopyOnWriteArrayList<String>();
CopyOnWriteArraySet
线程安全的Set,底层使用的是CopyOnWriteArrayList
实现。
唯一不同在于,使用addIfAbsent()添加元素,会遍历数组
如果存在元素,则不添加(扔掉副本)。
Set<String> set = new CopyOnWriteArraySet<String>();
ConcurrentHashMap
使用方式与HashMap无异。
初始容量默认为
16段
(segment),使用分段锁
设计。不是对整个Map加锁,而是为每个segment加锁。
当多个对象存入同一个Segment时,才需要互斥。
最理想状态下为16个对象分别存入16个Segment,并行数量为16。
理想情况下,支持最大并发16个线程。因为每一个数组是的一个元素是上了锁的,当hashcode计算到元素是存在数组相同的位置时,竞争同一把锁,线程安全,当不在同一个位置时,没有锁,可以进行操作。
public class TestCoucurrentHashMap{
public static void main(String [] args){
Map<String,String> map = new ConcurrentHashMap<String,String>();
}
}