JAVA并发类记录

本文详细解析了Java中的并发容器与队列,包括ArrayBlockingQueue、LinkedBlockingQueue、LinkedBlockingDeque、ConcurrentHashMap、SynchronousQueue等常用类,并深入探讨了它们的工作原理、区别及应用场景。

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最大。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值