ConcurrentHashMap
和hash差不多,不过hashmap不是线层安全的,而这个是线程安全的,关于hashmap可以看这1.8版本hashmap分析
这里也就是讲一下主要的区别:
- 对于多线程是线程安全的,
- 多出来个putIfAbsent() 方法,和put的区别请看这https://blog.csdn.net/weixin_43113679/article/details/89439856
CopyOnWriteArrayList
线程安全的变体ArrayList ,其中所有可变操作( add , set ,等等)通过对底层数组的最新副本实现
优点:
- 提供高效地读取操作,使用在读多写少的场景,读取操作不用加锁,且是安全的
- 写操作时,先copy一份原有数据数组,再对复制数据进行写入操作,最后将复制数据替换原有数据,从而保证写操作不影响读操作
- 使用了独占锁,支持多线程下的并发写。
缺点:
- 占用内存,写时 copy 效率低:如果这些对象占用的内存比较大,那么这个时候很有可能造成频繁的 Yong GC 和 Full GC。
- CopyOnWrite 容器只能保证数据的最终一致性,不能保证数据的实时一致性:写入的的数据,马上能读到就不要用它
- 当我们使用迭代器便利 CopyOnWriteArrayList 的时候,不能保证拿到的数据是最新的,这也是一致性问题。
- 由于实际使用中可能没法保证 CopyOnWriteArrayList 到底要放置多少数据,万一数据稍微有点多,每次 add/set 都要重新复制数组,这个代价实在太高昂了。在高性能的互联网应用中,这种操作分分钟引起故障。
ConcurrentLinkedQueue
链表作为数据结构,它采用无锁操作,可以任务是高并发环境下性能最好的队列。非阻塞线程安全队列,无界,故不太适合做生产者消费者模式
知道有这个,详细请看并发容器之ConcurrentLinkedQueue
LinkedBlockingQueue
链表的数据结构,阻塞线程安全队列,有界,适合做生产者消费者
详细请看【细谈Java并发】谈谈LinkedBlockingQueue
ConcurrentSkipListMap
SkipList(跳表)是一种随机性的数据结构,用于替代红黑树,因为它在高并发的情况下,性能优于红黑树。跳表实际上是以空间换取时间