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

  • 相关阅读:
    Django view(视图)
    Django ORM
    Django 路由系统(URLconf)
    Django简介
    Ubuntu 18.04安装MySQL指南
    一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
    一只简单的网络爬虫(基于linux C/C++)————开篇
    单例模式及单例类的两种实现
    对象析构不析构?
    C++11的mutex和lock_guard,muduo的MutexLock 与MutexLockGuard
  • 原文地址:https://www.cnblogs.com/longsanshi/p/8594896.html
Copyright © 2011-2022 走看看