blockingqueue原理
    BlockingQueueJava在urrent中提供的关于线程安全的并发队列,它可以让程序在没有达到期望的条件的时候挂起线程,也可以在有条件的时候唤醒线程。了简单的put、take、remove等操作外,它还支持在指定的时间内等待元素出现,或者把元素添加进队列去。
    BlockingQueue括两类:一类是直接提供实现的,即有界阻塞队列,它们是 ArrayBlockingQueueLinkedBlockingQueue PriorityBlockingQueue;另一类是另外两个对象组合而成的,即阻塞队列和定时器,它们是 SynchronousQueue DelayQueue。
    ## 二、BlockingQueue原理
    1. put()法
    put()法主要用来向 BlockingQueue加元素,它的实现逻辑如下:当 BlockingQueue公平锁时,put()法会先获取一个锁,然后调用 offer()法将元素添加到队列中,如果 offer()回 false,那么就调用 take()法,take()法会阻塞住直到有空位可以添加元素,然后释放锁,结束 put()法的执行。
    2. take()法
    take()法主要用来从队列中取出一个元素,如果为空,会被阻塞,直到添加了一个新的元素。它的实现逻辑如下:take()法会先加锁,然后调用 poll()法从队列中取出一个元素,如果 poll()回 null,那么就会调用 put()法,put()法会阻塞住线程直到有新的元素添加,然后释放锁,结束 take()法的执行。
    3. offer()法
    offer()法用来提供一种机会给客户端尝试将元素放入队列中,offer()法会检查队列是否已满,如果满了,就返回 false;如果不满,就将元素加入队列,并返回 true。
    4. poll()法
    poll()法用来从队列中获取并移除元素,poll()法会检查队列是否为空,如果为空,就返回 null;如果不为空,就取出队列第一个元素,并返回它。
block truncated    ## 三、BlockingQueue的应用场景
    BlockingQueue以用在多线程的场景下,用来队列来传递或存储数据。比如:
    1.产者-消费者模式:生产者线程将数据放入 BlockingQueue 中,消费者线程从 BlockingQueue 中取出数据,从而实现生产者-消费者模式。
    2.存机制:当数据量过大,有可能造成内存压力时,可以使用 BlockingQueue存储这些数据,从而达到缓存的目的。
    3.程池:线程池主要使用 BlockingQueue存储等待执行的任务,put()法添加任务,take()法取出任务,从而实现线程池的功能。
    ##、BlockingQueue的优缺点
    #### 优点:
    1.锁:BlockingQueue无锁的,它在使用 ReentrantLock Condition象来实现同步,而不是使用 synchronized键字,因此它可以提高程序的并发性。
    2.性能:BlockingQueue 使用非阻塞算法来实现线程之间的数据传输,这种算法可以有效
地提高程序的效率。
    3.全性:BlockingQueue线程安全的,可以同时被多个线程使用,而不会发生冲突。
    ####点:
    1.费空间:有些 BlockingQueue 会浪费较多的空间,比如 ArrayBlockingQueue,它会根据构造函数中指定的容量创建一个固定大小的数组,当添加的元素超过容量时,它会浪费较多的空间。
    2.制:BlockingQueue一定的容量限制,当达到最大容量时,如果想继续添加元素,就必须等待队列中的元素被消费,才能继续添加新的元素。
    ## 五、总结
    BlockingQueue Java发编程中的一种重要的数据结构,它在多线程的场景下可以很方便地用来传递或存储数据,比如在生产者-消费者模式、缓存机制和线程池中都有很多应用。它具有无锁、高性能、安全性的优点,但也有浪费空间和容量限制的缺点,需要注意。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。