java并发包

java中常用的map、list,queue都不是线程安全的,concurrent包提供了线程安全的实现

1.concurrentHashMap

内部使用(segement)来表示不同部分,每个段其实是一个小的hashTable,有自己的锁。只要多个修改操作发生在不同的段上,它们就可并发的进行,把一个整体分成了16个segment,就是支持16个线程的并发修改操作

这是多线程场景减小锁的粒度从而降低锁竞争的一种方案,并且大多共享变量使用volatile关键字的声明,目的是第一时间获取修改内容

2.copy-on-write

copyOnWrite容器即写时复制的容器,通俗的理解是当我们往一个容器添加元素的时候,不直接向当前容器添加,而是先将当前进行copy,复制出一个新的容器,然后向新的容器中添加元素,再将原容器的引用指向新的容器。

这样做的好处是我们可以对copyOnWrite容器进行并发的读,而不需要加锁。因为当前容器不会添加任何元素。(读写分离的思想)

3.并发queue

并发Queue接口有两个接口

ConcurrentLinkedQueue和BlockingQueue

前者是不阻塞队列,后者是阻塞队列

<1> ConcurrentLinkedQueue适用于共并发,通过无锁的方式实现。基于链接节点的无界线程安全队列,遵循先进先出原则,头是最先加入的,尾是最近加入的,不允许null值。

add 、offer方法在此结构中无区别,poll方法在取出元素的同时删除元素,peak方法在取出时不会删除元素

offer方法可以指定进入队列时间,若指定时间内元素没有进入队列则放弃

<2>

ArrayBlockingQueue

基于数组的阻塞队列实现,维护定长数组,长度需要定义,读写没有分离,生产者消费者不能完全并行,可指定先进先出或者先进后出,也称有界队列

LinkedBlockingQueue

内部维护链表,采用分离锁(读、写分两个锁,从而实现生产者消费者并行),无界队列

SynchronousQueue

无缓冲队列,生产者数据直接被消费获取消费

PriorityBlockingQueue

基于优先的阻塞队,优先级别的判断通过构造函数传入的compator对象决定,也就是说,传入队列的对象必须实现Comparable接口,在实现时,内部控制线程同步采用公平锁,无界队列。(设计的巧妙之处在于每次取元素时才排序)

DelayQueue 

带有延迟的Queue。其中的元素当其指定的延迟时间到了,才能在队列中获取该元素。DelayQueue中元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,如对缓存超时的数据进行删除、任务超时处理、空闲链接关闭等

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值