1.ArrayBlockingQueue: 一把锁,add 就是调用的offer,只是失败会抛异常,都不会等待
2.LinkedBlockingQueue: 两把锁,放和取不同锁
3.LinkedBlockingDeque: 双向 只有一把锁
4.ConcurrentLinkedQueue: CAS无锁算法,队列
5 SynchronousQueue: 可以认为SynchronousQueue是一个缓存值为1的阻塞队列,但是 isEmpty()方
法永远返回是true,remainingCapacity() 方法永远返回是0,remove()和removeAll() 方法永远返
回是false,iterator()方法永远返回空,peek()方法永远返回null
6.ConcurrentHashMap 分区(一个区相当于一个MAP),区内采用同一互拆锁;默认16个区,16个容
量,也就是一个区一个。 某个区不够是其容量*2扩展。值都是采取原子存。
存加锁;取时有值时不用锁,找到KEY没值时(加锁进入获取)等待写的锁释放再取,重要的是后面写
入的KEY是放在链头部的,才不用对KEY加锁读。
KEY相同是 由HASH且EQUALS相同。
HASHMAPKEY相同是 由HASH且(==或EQUALS)
7. ConcurrentSkipListMap 有序的跳表结构,多层链表。用空间换取查询时间
8. CopyOnWriteArrayList 其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的
复制来实现的.这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方
法可能比其他替代方法更 有效。
9.PriorityBlockingQueue 有序队列,默认11个,无界,可以自动增加。一把锁,TAKE会阻塞。内部
直接用的PriorityQueue
10.DelayQueue 无界阻塞延时队列,元素有延时时间,到期了,才能取出。一把锁
ThreadPoolExecutor:
corePoolSize和maximumPoolSize(根据队列边界是否扩展),运行线程小于corePoolSize时,则创
建新的线程,大于等于CORESIZE而少于最大SIZE时,放入队列等待空闲线程调用,列队满时创建新
线程。如果池中当前有多于 corePoolSize 的线程,则这些多出的线程在空闲时间超过
keepAliveTime 时将会终止。
所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的
线程。
如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况
下,任务将被拒绝
12. ScheduledThreadPoolExecutor 带时间器的线程池,继承自ThreadPoolExecutor,用的是延迟
队列,MAX最大。
本文详细解析了Java中的并发容器与队列,包括ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque、ConcurrentHashMap、SynchronousQueue等常用类,并深入探讨了它们的工作原理、区别及应用场景。

被折叠的 条评论
为什么被折叠?



