3、容器相关(点个赞呗)
2020-07-08 18:35:56 0 举报
AI智能生成
java容器
作者其他创作
大纲/内容
容器
常见容器
Collection
List
CopyOnWriteArrayList
高并发场景,读多写少(写加锁,读不加锁),解决fail fast
Vector
Stack
ArrayList
LinkedList
Set
HashSet
LiindedHashSet
SortedSet
TreeSet
EnumSet
CopyOnWriteArraySet
ConcurrentSkipListSet
Queue
常用实现
Deque
ArrayDeque
双端队列
BlockingDeque
LinkedBlockingQueue
BlockingQueue(线程池基础)
ArrayBlockingQueue
有界的
PriorityBlockingQueue
在PriorityQueue的基础上加了阻塞
LinkedBlockQueue
无界的,可以不断加入(最大为Integer的最大值),ReentrantLock加锁
TransferQueue
LinkedTransferQueue
做成链表可以传很多个任务,transfer后阻塞等待线程消费,使用场景一般为:需要有某个结果才能继续执行的情况,比如提交的订单,需要先被消费者处理了才能进行反馈者等操作,若不适用MQ,需要自己实现的话可以考虑用TransferQueue
SynchronousQueue
容量为0,与Exchanger类似,专门用于两个线程间传递任务、内容。一个线程put一个线程tack
DelayQueue
底层用PriorityQueue实现,按照在队列中等待的时间排序,等待时间短的优先执行,传入的任务对象需要实现Delayed接口。作用就是按时间进行任务调度
常用方法
put(E)
一定往里装,满了没法装就阻塞住
take()
一定往外取,空了就阻塞住
底层实现
用的Condition的await方法(LockSupport的park)方法实现阻塞
PriorityQueue
堆排序的二叉树实现
ConcurrentLinkedQueue
无锁cas,无界线程安全的队列,性能比BlockingQueue高
add(E)
list的接口,加不进去会抛异常
offer(E)
也是添加数据,但加不进去会有返回值,不抛异常
peek()
取数据不移除
poll()
取数据并移除
Map
HashMap
LinkedMap
TreeMap
WeakHashMap
IdentityHashMap
ConcurrentHashMap
不排序,HashMap的高并发版
排序,TreeMap的高并发版,跳表结构
基本结论
1、vector、hashTable是最初代时候的容器,由于自带锁效率低,所以现在基本不用
2、hashMap可以通过加锁变成线程安全的(Map map = Collections.synchronizedMap(new HashMap<>());),ConcurrentHashMap的写效率不高,但读效率非常高
3、不同并发下的选择
单线程
HashMap、ArrayList、LinkedList
多线程
执行时间短
优先考虑ConcurrentHashMap、Queue
执行时间长
synchronized类型的
4、(Tree)红黑树是为了查找方便,且写效率不会很低
5、BlockingQueue很好的适配消费者、生产者场景
6、list和queue的区别:
queue添加了很多对多线程情况下友好的api包括offer、peek、poll
BlockingQueue又添加了put、take(阻塞)
7、SynchronousQueue、TransferQueue区别在于前者是只能穿一个内容,后者可以传多个
8、ConcurrentLinkedQueue 和基于 BlockingQueue 接口的队列是线程安全的
9、补充了解常用工具类:Arrays(数组操作)、Collections(集合操作)、Executors(线程池工厂)
0 条评论
下一页