`

ArrayBlockingQueue 深入理解

 
阅读更多

         今天学习一下队列,队列第一反应就是先进先出的存取模式,今天主要讲的就是jdk1.5中的新特性,ArrayBlockingQueue 。

 

    功能:    

            1、ArrayBlockingQueue的存取是加了锁,所以ArrayBlockingQueue是线程安全的,支持并发操作;

            2、ArrayBlockingQueue是阻塞队列,当为空或者队列满是,线程取或者存是处于阻塞状态的;

            3、是实现生产者消费者模型的极好的备选工具。 

 

    实现依赖: 1、lock锁(内存的可见性、互斥访问、限制编译器的代码优化调整) 

                       2、Condition条件通知(线程间的协作) 
    核心方法:

        1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常 
        2)offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.
        3)put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续. 
        4)poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null 
        5)take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到Blocking有            新的对象被加入为止 

 

其他blockingqueue

 

 1)ArrayBlockingQueue:规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的. 
        2)LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的 
        3)PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序. 
        4)SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的. 
    3.LinkedBlockingQueue和ArrayBlockingQueue比较起来,它们背后所用的数据结构不一样,导致                  LinkedBlockingQueue的数据吞吐量要大于ArrayBlockingQueue,但在线程数量很大时其性能的可预见性低于ArrayBlockingQueue.      

 

 

 

 

分享到:
评论

相关推荐

    ArrayBlockingQueue源码解析-动力节点共

    在深入理解ArrayBlockingQueue的源码之前,我们需要先了解其基本概念和特性。 ArrayBlockingQueue的核心特点在于其固定大小的容量,这使得它在处理高并发场景时能有效控制资源消耗。队列的元素按照FIFO(先进先出)...

    Java源码解析阻塞队列ArrayBlockingQueue常用方法

    本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个固定大小的数组`items`,用于存储队列中的元素。此外,它还有3个关键的索引变量:`takeIndex`、`putIndex`和`count`...

    图解java多线程设计模式-结城浩-完整高清带书签版本

    此外,还介绍了基于BlockingQueue的线程间通信方式,如ArrayBlockingQueue、LinkedBlockingQueue等,这些队列在并发编程中扮演着重要角色。 4. **死锁与避免**:死锁是指两个或多个线程互相等待对方释放资源而造成...

    【2018最新最详细】并发多线程教程

    9.深入理解AbstractQueuedSynchronizer(AQS) 10.彻底理解ReentrantLock 11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13.LockSupport工具 14.并发容器之ConcurrentHashMap...

    深入浅出Java多线程.pdf

    综上所述,《深入浅出Java多线程.pdf》覆盖了Java多线程从基础知识到高级特性的各个方面,适合于想要深入理解Java多线程机制的开发人员阅读。无论是初学者还是有一定经验的开发者,都能从中获得宝贵的理论知识和实践...

    深入理解Java编程线程池的实现原理

    深入理解Java编程线程池的实现原理 Java中的线程池是通过ThreadPoolExecutor类来实现的,该类继承了AbstractExecutorService类,提供了四个构造方法,可以控制线程池的大小、核心池的大小、最大线程数、线程的存活...

    深入研究线程池~

    深入研究线程池:理解与应用 在计算机科学领域,线程池技术是现代多线程编程中的核心概念之一,尤其在Java等高级语言中,它被广泛应用于提高程序的并发性和响应性。线程池的基本思想是预先创建一定数量的线程,将...

    计算机后端-Java-Java高并发从入门到面试教程-发课程资料.zip

    - **Lock接口**:深入理解ReentrantLock(可重入锁)及其相关API,如Condition。 - **信号量Semaphore**:了解其在资源限制场景下的应用。 3. **并发容器** - **并发集合**:如ConcurrentHashMap、...

    java基础及中级面试题+jvm面试题+集合面试题

    最后,集合面试题会涉及Java集合框架的深入理解: 1. **集合接口**:List、Set、Queue、Map等接口的特点和使用场景。 2. **HashMap与HashTable**:对比两者的异同,理解线程安全和非线程安全的区别。 3. **...

    JAVA并发编程深度学习-无锁并行计算框架1

    在Java并发编程中,无锁并行计算框架如Disruptor提供了一种高效且低延迟的方式来...然而,使用Disruptor需要对并发编程有深入理解,因为其API和工作模式相比传统的并发工具更复杂,但带来的性能提升是值得投入学习的。

    JUC并发编程学习笔记(硅谷)

    "JUC并发编程学习笔记(硅谷)"很可能包含了关于Java并发工具集(Java Util Concurrency, JUC)的深入理解和实战经验。JUC是Java标准库提供的一套强大的并发处理工具,它极大地简化了多线程编程,提高了程序的可读性...

    实战Concurrent-BlockQueue

    本文将深入探讨`ConcurrentLinkedQueue`、`ArrayBlockingQueue`以及`LinkedBlockingQueue`这三种实现,并分析它们的设计原理与应用场景。 首先,我们来看`ConcurrentLinkedQueue`。它是基于非阻塞算法(CAS,...

    JAVA并发编程中文完全版

    综上所述,《JAVA并发编程中文完全版》这本书不仅覆盖了Java并发编程的基础理论,还深入探讨了许多高级主题和技术细节,对于希望深入理解和掌握Java并发编程技术的开发者来说,是一本非常有价值的参考书籍。...

    面试必问并发编程高级面试专题.zip

    深入理解`ThreadPoolExecutor`的工作模式,如核心线程数、最大线程数、任务队列和拒绝策略,有助于优化系统性能。 7. **阻塞队列**:如`LinkedBlockingQueue`和`ArrayBlockingQueue`,它们在并发编程中常用于线程间...

    Blocking Queue Usage

    在《Tomboxfan的博客》中,博主深入探讨了Blocking Queue的使用技巧,通过具体的示例代码(如提供的`ToastOMatic.java`文件)展示了如何在实际项目中应用阻塞队列,这对于我们理解并掌握Blocking Queue的实际应用...

    Android面试复习资料大全(包含java源码)

    14. **Java类加载机制及类加载器**:深入理解JVM类加载过程和自定义类加载器的实现。 15. **Java深拷贝和浅拷贝**:掌握对象拷贝的两种方式的区别和实现。 16. **Java transient关键字**:了解序列化时忽略字段的...

Global site tag (gtag.js) - Google Analytics