常用的5种并发包

常用的五种并发包

    ConcurrentHashMap

    CopyOnWriteArrayList

    CopyOnWriteArraySet

    ArrayBlockingQueue

    LinkedBlockingQueue

1、ConcurrentHashMap

      (1)线程安全的HashMap的实现

       (2)数据结构:一个指定个数的Segment数组,数组中的每一个元素Segment相当于一个HashTable(一个HashEntry[])

       (3)扩容的话,只需要扩自己的Segment而非整个table扩容

      (4)key与value均不可以为null,而hashMap可以

      (5)向map添加元素

                  5.1) 根据key获取key.hashCode的hash值

                  5.2) 根据hash值算出将要插入的Segment

                  5.3) 根据hash值与Segment中的HashEntry的容量-1按位与获取将要插入的HashEntry的index

                   5.4) 若HashEntry[index]中的HashEntry链表有与插入元素相同的key和hash值,根据onlyIfAbsent决定是否替换旧值

                    5.5) 若没有相同的key和hash,直接返回将新节点插入链头,原来的头节点设为新节点的next(采用的方式与HashMap一致,都是HashEntry替换的方法)

         (6)ConcurrentHashMap基于concurrencyLevel划分出多个Segment来存储key-value,这样的话put的时候只锁住当前的Segment,可以避免put的时候锁住整个map,从而减少了并发时的阻塞现象

从map中获取元素

         (7)根据key获取key.hashCode的hash值

                      7.1) 根据hash值与找到相应的Segment

                      7.2)根据hash值与Segment中的HashEntry的容量-1按位与获取HashEntry的index

                     7.3)遍历整个HashEntry[index]链表,找出hash和key与给定参数相等的HashEntry,例如e

                                   如没找到e,返回null

                                    如找到e,获取e.value

                                           如果e.value!=null,直接返回

                                           如果e.value==null,则先加锁,等并发的put操作将value设置成功后,再返回value值

           (8)对于get操作而言,基本没有锁,只有当找到了e且e.value等于null,有可能是当下的这个HashEntry刚刚被创建,value属性还没有设置成功,这时候我们读到是该HashEntry的value的默认值null,所以这里加锁,等待put结束后,返回value值

            (9)加锁情况(分段锁):

                  ---put

                  ---get中找到了hash与key都与指定参数相同的HashEntry,但是value==null的情况

                  ---remove

                  ---size():三次尝试后,还未成功,遍历所有Segment,分别加锁(即建立全局锁)


2、CopyOnWriteArrayList

     线程安全且在读操作时无锁的ArrayList

     采用的模式就是"CopyOnWrite"(即写操作-->包括增加、删除,使用复制完成)

      底层数据结构是一个Object[],初始容量为0,之后每增加一个元素,容量+1,数组复制一遍

      遍历的只是全局数组的一个副本,即使全局数组发生了增删改变化,副本也不会变化,所以不会发生并发异常。但是,可能在遍历的过程中读到一些刚刚被删除的对象

      增删改上锁、读不上锁

      读多写少且脏数据影响不大的并发情况下,选择CopyOnWriteArrayList

3、CopyOnWriteArraySet

      基于CopyOnWriteArrayList,不添加重复元素

4、ArrayBlockingQueue

     基于数组、先进先出、线程安全,可实现指定时间的阻塞读写,并且容量可以限制

     组成:一个对象数组+1把锁ReentrantLock+2个条件Condition

三种入队对比

      offer(E e):如果队列没满,立即返回true; 如果队列满了,立即返回false-->不阻塞

       put(E e):如果队列满了,一直阻塞,直到数组不满了或者线程被中断-->阻塞

     offer(E e, long timeout, TimeUnit unit):在队尾插入一个元素,,如果数组已满,则进入等待,直到出现以下三种情况:-->阻塞

       #被唤醒

      #等待时间超时

      #当前线程被中断

三种出对对比

      poll():如果没有元素,直接返回null;如果有元素,出队

      take():如果队列空了,一直阻塞,直到数组不为空或者线程被中断-->阻塞

      poll(long timeout, TimeUnit unit):如果数组不空,出队;如果数组已空且已经超时,返回null;如果数组已空且时间未超时,则进入等待,直到出现以下三种情况:

      #被唤醒

     #等待时间超时

     #当前线程被中断

需要注意的是,数组是一个必须指定长度的数组,在整个过程中,数组的长度不变,队头随着出入队操作一直循环后移

锁的形式有公平与非公平两种

在只有入队高并发或出队高并发的情况下,因为操作数组,且不需要扩容,性能很高

5、LinkedBlockingQueue

     基于链表实现,读写各用一把锁,在高并发读写操作都多的情况下,性能优于ArrayBlockingQueue

     组成一个链表+两把锁+两个条件

     默认容量为整数最大值,可以看做没有容量限制

三种入队与三种出队与上边完全一样,只是由于LinkedBlockingQueue的的容量无限,在入队过程中,没有阻塞等待

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容