ArraryBlockingQueue和LinkedBlockingQueue的区别
时间: 2023-11-30 12:37:35 浏览: 42
ArraryBlockingQueue和LinkedBlockingQueue是Java中的阻塞队列实现类,它们有一些区别:
1. 队列实现:ArraryBlockingQueue是基于数组实现的有界阻塞队列,而LinkedBlockingQueue是基于链表实现的可选且有界阻塞队列。
2. 容量:ArraryBlockingQueue的容量是固定的,一旦达到最大容量,再试图往队列中添加元素会导致阻塞。而LinkedBlockingQueue的容量可以根据需要动态调整,它可以是有界的也可以是无界的。
3. 性能:由于ArraryBlockingQueue使用数组实现,读写操作使用了独占锁,因此在高并发场景下,对于读写操作的竞争会更加激烈,性能可能相对较低。而LinkedBlockingQueue使用了两个独立的锁来控制读写操作,可以在高并发场景下提供更好的性能。
相关问题
ArraryBlockingQueue和LinkedBlockingQueue的
ArraryBlockingQueue和LinkedBlockingQueue是Java中的两种不同的阻塞队列实现。ArraryBlockingQueue是基于数组的有界阻塞队列,而LinkedBlockingQueue是基于链表的可选且有界阻塞队列。
ArraryBlockingQueue的大小是固定的,需要在创建队列时指定容量大小。如果队列已满,添加元素的操作将会被阻塞,直到有空间可用。如果队列为空,获取元素的操作也会被阻塞,直到有元素可取。
LinkedBlockingQueue的大小也是可选的,可以根据需要指定队列的大小。它内部使用单链表实现,从头部获取元素,从尾部添加元素。LinkedBlockingQueue采用了锁分离技术,实现了读写操作的并行执行,性能相对较好。
ArrayBlockingqueue和LinkedBlockingQueue的区别
ArrayBlockingQueue和LinkedBlockingQueue都是Java中的阻塞队列,它们的主要区别在于实现方式和性能表现。
ArrayBlockingQueue是一个基于数组实现的有界阻塞队列,它按照先进先出的原则对元素进行排序。由于其底层是数组,因此在创建时需要指定容量大小,且容量大小不可变。当队列已满时,再往队列里添加元素会导致线程阻塞;当队列为空时,从队列中取元素会导致线程阻塞。
LinkedBlockingQueue是一个基于链表实现的可选有界阻塞队列,它同样按照先进先出的原则对元素进行排序。与ArrayBlockingQueue不同的是,LinkedBlockingQueue在创建时可以指定容量大小,也可以不指定,不指定的话默认大小为Integer.MAX_VALUE。当队列已满时,再往队列里添加元素会导致线程阻塞;队列为空时,从队列中取元素会导致线程阻塞。
在性能方面,由于ArrayBlockingQueue是基于数组实现的,因此在并发环境下,它的性能比LinkedBlockingQueue更好。但是,由于ArrayBlockingQueue是有界的,因此在某些场景下可能会出现队列已满而无法添加元素的情况。而LinkedBlockingQueue则没有这个问题,但是在高并发环境下,它的性能可能会稍逊于ArrayBlockingQueue。