Concurrent包--复习总结

concurrent包

concurrent包是jdk1.5提供的一个针对高并发进行编程的包

BlockingQueue

阻塞式队列:遵循先进先出的原则,阻塞式队列本身使用过的时候是需要指定界限的。
ArrayBlockingQueue-阻塞式顺序队列–底层是基于数组来存储的时运的时候需要指定一个容量,容量在指定之后不可改变。应用为:生成-消费者模型
linkedBlockingQueue-阻塞式链式队列–底层是基于链表即节点来进行数据的存储,在使用的时候可以指定初始容量也可以不指定。如果指定了容量就以指定的容量进行存储,如果不指定容量就以默认容量来存储–默认容量是:Integer.MAX_VALUE=2^31 -1,如果不指定一般认为容量是无限的
PriorityBlockingQueue-具有优先级的阻塞式队列–默认容量是11.如果将元素取出,会对取出的元素进行自然排序–要求存储的对象所对应的类必须实现Comparable接口,重写器compareTo方法,将比较规则写到方法中;如果进行迭代遍历则不保证排序
SynchronousQueue-同步队列–只允许存储一个元素

ConcurrentMap-并发映射

HashMap-底层依靠数组+链表存储的数据。默认初始容量为16,默认加载因子是0.75f,默认扩容每次增加一倍,本身是一个异步式线程不安全的映射
Hashtable-同步式线程安全的映射–对外提供的方法都是同步方法
ConcurrentHashMap-异步线程安全的映射–在jdk1.8之前采用分段锁(分桶锁),分段锁采用的是读写锁机制;jdk1.8之后不再采用锁机制,而是采用CAS(Compare and Swap)无锁算法,减少了锁的开销;内部结构中,如果其中一个同中的元素个数超过了8个,那么会将这个桶的链表扭转成一棵红黑树(自平衡二叉查找树)结构

ConcurrentNavigableMap

并发导航映射:其本身是一个接口更多的会使用其实现类–ConcurrentSkipListMap–并发跳跃表映射
跳跃表:为了提高查询效率所产生的一种数据结构–跳跃表是典型的以空间换时间的产物
在这里插入图片描述
如果跳跃表中插入新的数据,新数据是否往上提取遵循“抛硬币”原则即1/2原则-只要保证这个节点有一般的几率能被提取就可以了。
跳跃表的数据结构适合于大量的查询而不增删的场景

CountDownLatch

闭锁:线程递减锁–对线程进行技术,当线程归零的时候会放开阻塞让线程继续往下执行
在这里插入图片描述

在这里插入图片描述
CyclicBarrier-栅栏
当所有线程都到达了同一个点之后才继续往下执行
在这里插入图片描述
在这里插入图片描述
Exchange-交换机
用于交换连个线程之间的信息
在这里插入图片描述
Semaphore-信号量
用于计数-信号在被用完之后,后来的线程阻塞,直到有信号被归还,被阻塞的线程才能取得信号继续执行
在这里插入图片描述

线程池

线程池:如果每一个请求对应一个线程,那么会导致大量的创建线程和销毁线程。减少线程的创建和销毁,希望能够重复使用已有的线程,就有了线程池即存储线程的队列
线程池的特点:
1.线程池在川建安的时候里面没有线程
2.当过来请求的时候就会在线程池中创建一个线程来处理这个请求,当请求处理完成之后线程就会还回线程池等待下一个请求
3.核心线程在线程池中需要限定数量
4.如果所有的核心线程都在使用,那么再来的线程就会放入工作队列中,工作队列是一个阻塞式队列。
5.如果所有的核心线程都被占用并且工作队列已满,那么会创建临时线程区处理新的请求
6.临时新城处理完请求之后并不是立即销毁,而是存活一段时间,如果过了这段时间依然没有新的请求,那么临时线程就被销毁
在这里插入图片描述
在这里插入图片描述

java提供的线程池

在这里插入图片描述

Callable和Runnable的区别

1.Runnable线程执行完成之后没有返回值;Callable需要定义返回值类型并且返回结果
2.Runable线程可以通过Thread启动执行,也可以通过线程池启动执行;Callable只能通过线程池来执行
3.Runnable没有容错机制,一旦出现异常需要自己处理;Callable可以将异常抛出利用全局的方式来处理

scheduledExecutorService-定时执行者服务

在这里插入图片描述
在这里插入图片描述

分叉合并-For and Join

将一个大任务不断的分成多个小任务(分叉),小任务在执行完成之后再将结果进行汇总(合并)
任务在分叉之后会分发到CPU不同的核上去,然后利用核进行数据的处理。原来的for循环只是在一个核上来执行的代码,所欲就导致分叉合并效率要高于for循环
分叉合并采取了work-stealing(工作窃取)策略来实现线程的高效操作–当一个核上的所有线程执行完成,就会随机挑一个核,从这个核的线程队列中偷取最后一个线程回来,然后执行
在这里插入图片描述
分叉合并会带来资源共享问题
在这里插入图片描述
在这里插入图片描述

Lock

锁机制比synchronized更加灵活,存在公平和非公平策略:
非公平策略是当线程释放锁之后依然可以再次抢占资源;
公平策略是当线程释放锁之后会到队列中让其他线程进行进行抢占资源
从效率上考虑,非公平的效率会更高
在这里插入图片描述

ReadWriteLock–读写锁

readlock:读锁–允许多个线程读但是不允许线程写
writelock:写锁–允许一个线程写,但是不允许线程读

Volatile–原子性操作

在这里插入图片描述
volatile本身是一个关键字,保证属性在多线程场景下的原子性
线程在底层的执行过程可能产生的指令的错乱—寄存器/PC计数器
volatile–限定线程在执行过程中必须按照给定的指令顺序来执行
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值