并发--并发容器

一.1.7concurrenthashmap

1. 1.7concurrenthashmap结构:
currenthashmap维护了一个segment数组,每一个segment继承了reentrantlock,可以扮演锁的脚色,它的数据结构跟hashmap类似,里面维护了一个hashentry数组,每个hashentry除了本身数据之外,还有next指针,指向其他hashentry构成链表。所以当数据进行操作时,就必须先定位到segment,这里用到了分段锁,再根据操作来是否对segment加锁,get不用加锁,put加锁,remove加锁,size先不加锁,失败后才枷锁。
2.1.7concurrenthashmap的操作:
1.get:get操作不用加锁,因为segment的count和hashentry操作都是volatile变量,所以能保证每个线程存储着的都是他们的最新值,不会出现脏读。
2.put操作:加锁。加入元素后,判断是否需要扩容,比hashmap好,先判断是不是满了,不会浪费。 扩容只是针对所在的segment扩容,不会对所有扩容。
3。remove操作:加锁。删除元素,需要枷锁。因为next指针是为final类型的,所以需要将前面的结点进行复制一遍后,将最后的结点next指针指向要删除元素的下一个指针.
4.size操作:就是累积每个segment里的count值,虽然count是volatile,能得到最新值,但是相加完前面segment的count可能又会变化。所以通过两次统计count+modcount变量来进行,每个segment维护了一个modcount,只增不减的,当put或者remove都会加1.统计两次modcount是不是相同,相同就说明统计过程没有变化,不相同再对所有的segment枷锁在进行统计。
https://www.cnblogs.com/qq78292959/p/4535742.html concurrenthashmap文章

2.阻塞队列的方法:
BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null 或 false,具体取决于操作),第三种是在操作可以成功前,无限期地阻塞当前线程,第四种是在放弃前只在给定的最大时间限制内阻塞。下表中总结了这些方法:

抛出异常 	特殊值	   阻塞    	超时

插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)

二.阻塞队列

1.什么是阻塞队列?
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。
这两种附加的操作是:在队列为空时,获取元素的等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。
阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
JDK7提供了7个阻塞队列。
分别是:ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列

四.fork/join框架

1.用途:就是用来做并行执行任务的,先把一个大任务分成一个个小任务,然后把这些小任务分别放在几个双端队列里来维护,然后为每一个双端队列来创建一个线程来执行这些任务. 并把计算结果放在队列中.然后将每个队列的执行结果放在统一的一个队列,再创建一个线程为汇总结果得到大任务的结果. 还支持工作窃取算法,比如有线程执行完自己的任务,会从别人的队列中偷任务来执行,为了避免竞争,偷从双端队列的尾部偷,自己线程执行在头部拿任务执行.
主要通过两个类来实现.
1.Forkjointask.创建Forkjoin任务需要实现Forkjointask,可以继承它的子类,比如recursiveaction这个没有返回结果的任务,和recursivetask这个是有返回结果的任务.需要实现里面如何划分子任务的方法compute()方法.
2.Forkjoinpool.把forkjoin任务交给forkjoinpool来执行.

同步容器

同步容器就是需要同步的方法上加上关键字synchronized 。比如hashtable,vector。

问题:1.concurrenthashmap扩容过程.?
2.hashmap为什么会出现死循环?
3.阻塞队列和fork join还未学习?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值