LinkedBlockingQueue如果设置初始容量是10,前五个节点有值,后五个节点是存了null,还是直接不会分配内存
时间: 2024-05-26 16:15:44 浏览: 250
LinkedBlockingQueue是基于链表实现的阻塞队列,它的容量是可以动态的增加或减少的,因此设置初始容量只是一个参考值,不会直接分配内存。如果初始化时设置了初始容量为10,但只放入了5个节点,后面的5个节点为空,那么LinkedBlockingQueue并不会分配额外的内存来存储这些空节点,所占用的内存只与队列中实际存储的元素数量有关。当队列中的元素数量达到容量上限时,才会进行动态的内存分配,以扩大队列的容量。
相关问题
LinkedBlockingQueue使用
LinkedBlockingQueue是一个可变范围的链表,它是一个先进先出(FIFO)的队列。新元素被添加到队列的尾部,检索操作获取队列的头部。它具有较高的吞吐量,但在并发应用中具有较少的可预见性操作。该队列的容量大小是可变的,默认为Integer.MAX_VALUE,可以通过构造函数指定容量。链表节点会动态地创建,直到达到容量。LinkedBlockingQueue实现了BlockingQueue接口和Queue接口的所有方法。在处理多线程的并发问题时,常常用到LinkedBlockingQueue。
具体来说,LinkedBlockingQueue的poll()方法是从队列中取出元素。如果队列为空,则会阻塞给定的时间,直到有元素可取。使用了takeLock保证线程安全。在取出元素之前,会检查队列是否为空,如果为空且超出给定的时间,则返回null。如果成功取出元素,会将队列的计数减1,如果还有其他线程在等待插入操作,则唤醒其中一个线程。如果取出元素后队列变为空,则唤醒一个插入线程。
LinkedBlockingQueue的put()方法是向队列中添加元素。如果队列已满,则会阻塞当前线程,直到队列有空间可用。使用了putLock保证线程安全。在添加元素之前,会检查要添加的元素是否为null。如果队列已满,则当前线程会等待,直到有其他线程从队列中取出元素。成功添加元素后,会将队列的计数加1,如果队列还有空间,则唤醒一个等待的插入线程。
总结起来,LinkedBlockingQueue是一个具有线程安全特性的队列,可以在多线程环境中安全地进行元素的添加和取出操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [LinkedBlockingQueue应用详解](https://blog.csdn.net/qq_34444097/article/details/78947025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [LinkedBlockingQueue用法](https://blog.csdn.net/weixin_41771218/article/details/83056052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文