并发的容器

并发的容器

1:JDK提供的并发容器

提供的都在java.util.concurrent包下面

  • concurrnethashmap 线程安全的hashmap
  • copyonwritearraylist 线程安全的list,在读多于写的情况下,非常实用
  • concurrentlinkedlist:高效的并发队列,使用链表连接,可以看作是线程安全的linkedlis,这是一个非阻塞队列
  • blockingqueue:接口,通过链表,数组等方式实现了这个接口。表示阻塞队列,适用于数据共享的通道
  • concurrnetskiplistmap:跳表的实现,这是一个map,使用跳表的数据结构进行快速查询

2:conlinkedlist

  • Java提供的线程安全的queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子就是blockingqueue非阻塞队列就是concurrentlinkedqueue阻塞队列可以通过加锁来实现,非阻塞队列可以使用CAS操作实现
  • 从名字可以看出,concurrentlinkedqueue,这个使用链表来作为数据结构,主要使用cas非阻塞的算法来实现线程安全
  • 适用于对队列读写存在多个线程进行的场所,如果对队列加锁的成本比较高那么就适合使用无所的concurrenlinkedqueue来实现

3:blockingqueue

3.1:你了解什么

  • blockingqueue是线程安全的堵塞队列,它使用加锁的机制来实现
  • 当队列的容器已经满了,生产者线程会被阻塞,直到队列没有满
  • 当队列容器为空的时候,消费者线程会被阻塞,直到队列到非空的时候

3.2:arrayblockingqueue

  • 采用数组的方式来实现,容量不能改变。
  • 不管是插入还是读取,都需要获取到锁才能够操作
  • 默认情况下不能够保证公平性,如果要保证,可以新建立的时候设置为true

3.3:linkedblockingqueue

  • 基于单向链表实现的阻塞队列,具有FIFO的性质
  • 一般需要在创建的时候指定大小,如果没有指定,容量等于 MAX
3.4:priorityblockingqueue
  • 支持优先级的阻塞队列,默认情况下采用自然排序
  • 并发控制采用reentrantLock,且在创建的时候必须指定容量的大小
  • 不可以插入 null,同时必须是课比较大小的,否则会 classCastException

4:concurrentskiplistmap

  • 给定一个单链表,即使链表是有序的,我们想要查询一个数据,也只能从头遍历到尾巴上,这样的效率很低
  • 跳表就不一样,跳表是一种能偶来快速查找的数据结构,类似与平衡树
  • 对跳表的插入和删除只需要对整个数据结构的局部进行操作,这样带来的好处就是,你只需要锁住一部分就可以了
  • 而在查询的性能上,跳表的时间复杂度是 log n
  • 跳表的本质是维持了多个链表,并且每个链表之间是分层的
    • 最底层的链表维护了跳表内部的所有元素,每上面一层链表都是下面一层的子集
    • 跳表内的所有链表都是排序的,查找的时候,可以从顶部链表开始,一旦发现被查找的元素大于当前链表中的取值,就会转入下一层链表继续找。
    • 这也就是说在查找的过程中,搜索是跳跃式的,是一种以空间换取时间的数据结构
    • 使用跳表实现map和哈希算法不同之处是:哈希并不会保存元素的顺序,但是跳表之中都是排序的,因此对跳表进行遍历的时候,你会得到一个有序的结果。

5:copyonwritearraylist

  • 在很多的场景之下,读操作可能会远远的大于写操作,由于读操作根本不会修改原有的数据,所以对于每次的读加锁是一种资源的浪费,我们允许多个进程同时读取数据
  • copyonwritearraylist,读取是完全不用加锁的,并且写入也不会堵塞读操作,只有写入和写入之间需要进行同步的等待

5.1实现原理

  • add,set都是创建底层数组的新的副本来实现的,当list需要被修改的时候,并不修改当前的数据,而是对原有的数据进行一次复制,将修改的内容写入副本。写完之后,再将修改完的副本替换完原来的数据,这样就可以保证写数据不会影响读操作 。

5.2 读取操作

  • 读取操作没有任何的绒布机制和锁操作,因为读取不会被数据造成任何的修改

5.3写操作

  • 写入操作的时候,加了锁,避免了多个线程同时修改,导致多个副本出来

6:concurrenthashmap

  • hashmap不是线程安全的,
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值