zoukankan      html  css  js  c++  java
  • BlockingQueue 阻塞队列2

    一、各自特点:

    1.ArrayBlockingQueue

        1)元素的放入和取出都是用同一个锁,所以放入和取出元素并不能够并行运行,LinkedBlockingQueue放入和取出用的是独立锁

        2)定长的,初始化时候需要设定

        3)和LinkedBlockingQueue对比需要更加少的空间,ArrayBlockingQueue在插入或删除元素时不会产生或销毁任何额外的对象实例,而LinkedBlockingQueue会生成一个额外的Node对象

        4)创建时候可以设定是否用公平锁,默认非公平锁

    2.LinkedBlockingQueue

        1)相对于ArrayBlockingQueue,能够处理更高的并发,因为添加和取出用的独立锁,性能会跟好些

        2)如果不设置容量,默认容量为最大整形数(Integer.MAX_VALUE),如果生成大于消费,长时间运行会导致内存消耗殆尽

    3.PriorityBlockingQueue

        1)采用公平锁

        2)不会阻塞生产者,只会阻塞消费者,所有运用场景应该是消费能力大于生成能力,否则可能导致堆空间

    4.DelayQueue

        1)无限大容量

        2)可以设置队列里面的对象被延时取出

    5. SynchronousQueue

    这个不清楚

    二、阻塞队列一共有四套方法分别用来进行insertremoveexamine,当每套方法对应的操作不能马上执行时会有不同的反应,下面这个表格就分类列出了这些方法:

    -Throws ExceptionSpecial ValueBlocksTimes Out
    Insert add(o) offer(o) put(o) offer(o, timeout, timeunit)
    Remove remove(o) poll() take() poll(timeout, timeunit)
    Examine element() peek()    
    1. ThrowsException:如果操作不能马上进行,则抛出异常
    2. SpecialValue:如果操作不能马上进行,将会返回一个特殊的值,一般是true或者false
    3. Blocks:如果操作不能马上进行,操作会被阻塞
    4. TimesOut:如果操作不能马上进行,操作会被阻塞指定的时间,如果指定时间没执行,则返回一个特殊值,一般是true或者false
    还有:drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数), 
        通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。这个不清楚
    根据不同的业务场景选用不同,一般用timeout的这种,预留一定的时间去执行,执行失败有返回值,可以判断操作的失败与否



    参考:http://wsmajunfeng.iteye.com/blog/1629354
    http://blog.csdn.net/suifeng3051/article/details/48807423

  • 相关阅读:
    <<信息学奥赛一本通>> 昆虫养殖 题解
    C++ primer 第七章 练习7.35 类作用域练习
    C++ primer 第六章 练习6.56 函数指针练习
    P1145 约瑟夫
    C++ 查看auto delctype 后变量的类型。(小技巧)
    Educational Codeforces Round 24 题解
    HDU 5279 分治NTT 图的计数
    BZOJ 3473
    BZOJ 3514 LCT+主席树
    看无可看 分治FFT+特征值方程
  • 原文地址:https://www.cnblogs.com/longsanshi/p/8594896.html
Copyright © 2011-2022 走看看