无题

作者: 小川君 | 来源:发表于2018-09-23 20:28 被阅读0次

LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。
此外,LinkedBlockingQueue还是可选容量的(防止过度膨胀),即可以指定队列的容量

LinkedBlockingQueue在实现“多线程对竞争资源的互斥访问”时,对于“插入”和“取出(删除)”操作分别使用了不同的锁

对于ArrayBlockingQueue来说,当队列在进行入队和出队时,永远只能有一个操作被执行。因为该队列只有一把锁,所以在多线程执行中并不允许同时出队和入队。

与ArrayBlockingQueue不同的是,LinkedBlockingQueue拥有两把锁,一把读锁,一把写锁,可以在多线程情况下,满足同时出队和入队的操作。

在ArrayBlockingQueue中,由于出队入队使用了同一把锁,无论元素增加还是减少,都不会影响到队列元素数量的统计,所以使用了int类型的变量作为队列数量统计。

但是,在LinkedBlockingQueue中则不同。上面说了,在LinkedBlockingQueue中使用了2把锁,在同时出队入队时,都会涉及到对元素数量的并发修改,会有线程安全的问题。因此,在LinkedBlockingQueue中使用了原子操作类AtomicInteger,底层使用CAS(compare and set)来解决数据安全问题。

ArrayBlockingQueue和LinkedBlockingQueue都是通过加锁来实现同步的,也就是通过阻塞线程来实现同步的,称为阻塞队列

ConcurrentLinkedQueue是通过CAS来实现同步,没有用到锁,称为非阻塞队列

ArrayListBlockingQueue是有界的,是一个有界缓存的等待队列。
基于数组的阻塞队列,同LinkedBlockingQueue类似,内部维持着一个定长数据缓冲队列(该队列由数组构成)。ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。
ArrayBlockingQueue在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于LinkedBlockingQueue;按照实现原理来分析,ArrayBlockingQueue完全可以采用分离锁,从而实现生产者和消费者操作的完全并行运行。Doug Lea之所以没这样去做,也许是因为ArrayBlockingQueue的数据写入和获取操作已经足够轻巧,以至于引入独立的锁机制,除了给代码带来额外的复杂性外,其在性能上完全占不到任何便宜。 ArrayBlockingQueue和LinkedBlockingQueue间还有一个明显的不同之处在于,前者在插入或删除元素时不会产生或销毁任何额外的对象实例,而后者则会生成一个额外的Node对象。这在长时间内需要高效并发地处理大批量数据的系统中,其对于GC的影响还是存在一定的区别。

SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列,但是 isEmpty()方法永远返回是true,remainingCapacity() 方法永远返回是0,remove()和removeAll() 方法永远返回是false,iterator()方法永远返回空,peek()方法永远返回null。

声明一个SynchronousQueue有两种不同的方式,它们之间有着不太一样的行为。公平模式和非公平模式的区别:如果采用公平模式:SynchronousQueue会采用公平锁,并配合一个FIFO队列来阻塞多余的生产者和消费者,从而体系整体的公平策略;但如果是非公平模式(SynchronousQueue默认):SynchronousQueue采用非公平锁,同时配合一个LIFO队列来管理多余的生产者和消费者,而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理。

相关文章

  • 无题

    无题无题无题

  • 无题

    无题,, 无题,, , 仍是无题,, ,

  • 太阳书库陈掌柜16年诗17首

    2016年诗17首 目录 下雨天 5.23 无题 8.10 无题 8.17 无题 8.26 无题 8.29 无题 ...

  • 《读李商隐无题》

    诗可以无题 酒可以无题 只要心心相悦 情也可以无题 词可以无题 醉可以无题 只要心心相印 爱也可以无题 你一直在...

  • 《读李商隐无题》

    诗可以无题 酒可以无题 只要心心相悦 情也可以无题 词可以无题 醉可以无题 只要心心相印 爱也可以无题 你一直在...

  • 心一一无题 身一一无题 神一一无题 懂你!不懂我!呵呵一一无题……

  • 无题

    今日无题 是因为不想更新 偷懒 今日无题 是因为不知道能写什么 无力 今日无题 我突然想到古代那些诗人 为什么无题...

  • 无题

    李商隐最好的诗大都叫“无题”。所谓“无题”,并非无题,题不足以名之也。就像这首传颂度颇高的名作: 《无题》 昨夜星...

  • 随无题

    图片发自简书App 随无题 无题随 ...

  • 无题

    我总是喜欢无题 无题的胡思乱想 无题的放空思绪 无题的发呆 我最会做的事情是什么? 非发呆莫属吧 发着呆 望着窗外...

网友评论

      本文标题:无题

      本文链接:https://www.haomeiwen.com/subject/ccpqoftx.html