如何将非线程安全的容器变成线程安全的容器?

用synchronized修饰非线程安全的方法即可,但是串行化程度太高

1.5之后为了解决加锁带来串行化

CopyOnWriteArrayList

读快照
写副本
只有最终一致性
合并快照的方法是setArray,在add或者set等中调用
底层数组使用volatitle修饰,保证可见性。

ConcurrentHashMap 和 ConcurrentSkipListMap

主要区别在于 ConcurrentHashMap 的 key 是无序的,而 ConcurrentSkipListMap 的 key 是有序的

linkedHashMap 也是有序的, 因为是双向链表所以有序。

CopyOnWriteArraySet 和 ConcurrentSkipListSet

使用场景可以参考前面讲述的 CopyOnWriteArrayList 和 ConcurrentSkipListMap,它们的原理都是一样的

Queue

从以下两个维度来分类。

阻塞与非阻塞,所谓阻塞指的是当队列已满时,入队操作阻塞;当队列已空时,出队操作阻塞。

单段 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue 和 DelayQueue。

单端与双端,单端指的是只能队尾入队,队首出队;而双端指的是队首队尾皆可入队出队。Java 并发包里阻塞队列都用 Blocking 关键字标识,单端队列使用 Queue 标识,双端队列使用 Deque 标识。