线程安全的集合

线程安全的集合

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无异

线程安全的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>();
    }
}

posted @ 2020-07-18 17:24  筋肉猩  阅读(227)  评论(0编辑  收藏  举报