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