本文主要整理博主碰着的Java多线程的相关常识点,适合速记,故定名为“小抄集”。本文没有出格重点,每一项针对一个多线程常识做一个提要性总结,也有一些会带一点例子,习题利便领略和影象。
27. ConcurrentHashMap
ConcurrentHashMap是线程安详的HashMap,内部回收分段锁来实现,默认初始容量为16,昆山软件开发,装载因子为0.75f,分段16,每个段的HashEntry<K,V>[]巨细为2。键值都不能为null。每次扩容为本来容量的2倍,ConcurrentHashMap不会对整个容器举办扩容,而只对某个segment举办扩容。在获取size操纵的时候,不是直接把所有segment的count相加就可以可到整个ConcurrentHashMap巨细,也不是在统计size的时候把所有的segment的put, remove, clean要领全部锁住,这种要领太低效。在累加count操纵进程中,之前累加过的count产生变革的几率很是小,所有ConcurrentHashMap的做法是先实验2(RETRIES_BEFORE_LOCK)次通过不锁住Segment的方法统计各个Segment巨细,假如统计的进程中,容器的count产生了变革,再回收加锁的方法来统计所有的Segment的巨细。
28. 线程安详的非阻塞行列
非阻塞行列有ConcurrentLinkedQueue, ConcurrentLinkedDeque。元素不能为null。以ConcurrentLinkedQueue为例,有头head和尾tail两个指针,遵循FIFO的原则举办入队和出队,要领有add(E e), peek()取出不删除, poll()取出删除, remove(Object o),size(), contains(Object o), addAll(Collection c), isEmpty()。ConcurrentLinkedDeque是双向行列,可以在头和尾两个偏向举办相应的操纵。
29. 阻塞行列
阻塞行列(BlockingQueue)是一个支持两个附加操纵的行列。这两个附加的操纵支持阻塞的插入和移除要领。
支持阻塞的插入要领:意思是当行列满时,行列会阻塞插入元素的线程,直到行列不满。
支持阻塞的移除要领:意思是行列为空时,获取元素的线程会期待行列变为非空。
任何阻塞行列中的元素都不能为null.
30. 阻塞行列的插入和移除操纵处理惩罚方法:
要领-处理惩罚要领 抛出异常 返回非凡值 大概阻塞期待 可设定期待时间
入队 add(e) offer(e) put(e) offer(e,timeout,unit)
出队 remove() poll() take() poll(timeout,unit)
查察 element() peek() 无 无
假如是无界行列,行列不行能呈现满的环境,所以利用put或offer要领永远不会被阻塞,并且利用offer要领时,该要领永远返回true.
31. Java里的阻塞行列
ArrayBlockingQueue:一个由数组布局构成的有界阻塞行列。
LinkedeBlockingQueue:一个有链表布局构成的有界阻塞行列。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞行列
DelayQueue:一个利用优先级行列实现的无界阻塞行列。
SynchronousQueue:一个不存储元素的阻塞行列。
LinkedTransferQueue:一个由链表布局构成的无界阻塞行列。
LinkedBlockingDeque:一个由链表布局构成的双向阻塞行列。
32. ArrayBlockingQueue
此行列凭据FIFO的原则对元素举办排序,可以设定为公正ArrayBlockingQueue(int capacity, boolean fair),默认为不公正。初始化时必需设定容量巨细ArrayBlockingQueue(int capactiy)。
33. LinkedBlockingQueue
与ArrayBlockingQueue一样,凭据FIFO原则举办排序,与ArrayBlockingQueue差异的是内部实现是一个链表布局,且不能配置为公正的。默认和最大长度为Integer.MAX_VALUE。
34. PriorityBlockingQueue
是一个支持优先级的无界阻塞行列,默认初始容量为11,默认环境下回收自然顺序升序分列,不能担保同优先级元素的顺序。内部元素要么实现Comparable接口,要么在初始化的时候指定结构函数的Comparator来对元素举办排序,有关Comparable与Comparator的细节可以参考:Comparable与Comparator浅析。
35. DelayQueue
DelayQueue是一个支持延时获取元素的无界阻塞行列。内部包括一个PriorityQueue来实现,行列中的元素必需实现Delay接口,在建设元素时可以指定多久才气从行列中获取当前元素。只有在延迟期满时才气从行列中提取元素。
DelayQueue很是有用,可以将DelayQueue运用在下面应用场景。
- 缓存系统的设计:可以用DelayQueue生存缓存元素的有效期,利用一个线程轮回查询DelayQueue,一旦能从DelayQueue中获取元素时,暗示缓存有效期到了。
- 按时任务调治:利用DelayQueue生存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,好比TimerQueue就是利用DelayQueue实现的。
36. SynchronousQueue
是一个不存储元素的阻塞行列,每一个put操纵必需期待一个take操纵,不然不能继承添加元素,很是适合通报性场景。支持公正会见行列。默认环境下线程回收非公正计策会见行列。
37. LinkedTransferQueue