java 容器
容器
Map
TreeMap
- 底层是红黑树
多线程容器
HashTable&&Vector
- 所有方法自带锁。
- java1.0 最早的数据类,所有方法都加了synchronized,基本不会使用这个类型。
HashMap
- 默认是无锁的,如果需要锁可以使用
var synchronizedMap = Collections.synchronizedMap(new HashMap<String, String>());
- 内部还是synchronized锁,因为不是所有方法/地方都需要加锁,所以锁的力度会变小,性能也就可以更高一些,但是使用的依然是synchronized 并没有使用juc里的锁,所以性能依然不是特别高。
ConcurrentHashMap
- 一般情况下使用这个集合框架
HashTable,HashMap,ConcurrentHashMap 100个线程100w数据插入 性能对比
容器 | cost |
---|---|
HashTable | 699ms |
有锁HashMap | 479ms |
ConcurrentHashMap | 1900ms |
- 如上ConcurrentHashMap 性能反而比另外两种数据类型差,原因是这个数据类型的优势是读取,他在写入里做了很多判断
HashTable,HashMap,ConcurrentHashMap 100个线程100w数据读取 性能对比
容器 | cost |
---|---|
HashTable | 32680ms |
有锁HashMap | 38000ms |
ConcurrentHashMap | 1746ms |
- 读取的时候是另外两种类型的十几倍。
ConcurrentSkipListMap
- 基于跳表实现,跳表等于分成很多段,根据key 的hash 可以把值的范围控制在一个范围内,锁定范围后只需要在那一个范围里查找即可。
- 是一个读写速度比较均衡的数据结构
CopyOnWriteArrayList
- 特点是写的效率比较低,读取的时候不加锁比ConcurrentHashMap快
- 写的时候的逻辑是每次拷贝一个list 出来并且容量+1,把add 的数据指向最后。
- 使用场景为读特别多,但是写比较少的情况。
BlockingQueue
- 阻塞队列 主要包含如下几个常用 api
- 天生生产者消费者模型
- 和queue的区别为当put的时候如果满了阻塞住,如果take 没取到也阻塞住。
DelayQueue
- 延时队列
- 业务场景为按照时间进行任务调度
- 可以重写compareTo 去重写排序规则
SynchronousQueue
- 当put 的生产者数据未被消费者消费,生产者会阻塞住。