zoukankan      html  css  js  c++  java
  • LinkedBlockingQueue和ArrayBlockingQueue区别

    LinkedBlockingQueue和ArrayBlockingQueue区别

    1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;

    2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列

      内部都是使用ReentrantLock和Condition来保证生产和消费的同步;

      当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞;

    使用Condition的方法来同步和通信:await()和signal()

    不同:

    1、由上图可以看出,他们的锁机制不同

      LinkedBlockingQueue中的锁是分离的,生产者的锁PutLock,消费者的锁takeLock

      而ArrayBlockingQueue生产者和消费者使用的是同一把锁;

    2、他们的底层实现机制也不同

      LinkedBlockingQueue内部维护的是一个链表结构

    在生产和消费的时候,需要创建Node对象进行插入或移除,大批量数据的系统中,其对于GC的压力会比较大

      而ArrayBlockingQueue内部维护了一个数组

    在生产和消费的时候,是直接将枚举对象插入或移除的,不会产生或销毁任何额外的对象实例

     3、构造时候的区别

      LinkedBlockingQueue有默认的容量大小为:Integer.MAX_VALUE,当然也可以传入指定的容量大小

    ArrayBlockingQueue在初始化的时候,必须传入一个容量大小的值

      看其提供的构造方法就能知道

    4、执行clear()方法

      LinkedBlockingQueue执行clear方法时,会加上两把锁

    5、统计元素的个数

      LinkedBlockingQueue中使用了一个AtomicInteger对象来统计元素的个数

      ArrayBlockingQueue则使用int类型来统计元素

  • 相关阅读:
    proxool配置及测试(数据库用的MySQL)
    Spring MVC
    修改类不重启tomcat 自动加载项目
    【ssm】拦截器的原理及实现
    springmvc实现json交互 -requestBody和responseBody
    Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 配置校验器
    spring-dao.xml配置问题(一)
    tomcat自动缓存的几种解决方式
    editor does not contain a main type的解决方案
    实现PageProcessor
  • 原文地址:https://www.cnblogs.com/lgjava/p/13272153.html
Copyright © 2011-2022 走看看