Java中LinkedBlockingQueue与ArrayBlockingQueue的异同
在Java中,BlockingQueue是一种具有线程安全特性的队列实现,在多线程环境下广泛应用。LinkedBlockingQueue和ArrayBlockingQueue是两种常见的BlockingQueue实现。本篇攻略将详细讲解这两者的异同。
LinkedBlockingQueue
LinkedBlockingQueue是一种基于链表实现的阻塞队列。它的容量大小可以选择无限大或指定大小。
LinkedBlockingQueue通过将插入和删除操作分别在不同的锁上同步进行,并且使用Condition条件变量实现等待通知机制实现多线程的并发访问。一个线程若向已满的LinkedBlockingQueue中插入数据,该线程会阻塞,直到其它线程从该队列中取出数据以空出位置;同样,如果一个线程向一个空LinkedBlockingQueue中取数据,该线程也会被阻塞,直到有数据被放入队列。
下面是一个示例代码:
import java.util.concurrent.LinkedBlockingQueue;
public class LinkedBlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>(2);
queue.put(1);
queue.put(2);
System.out.println(queue.take());
System.out.println(queue.take());
}
}
运行结果为:
1
2
ArrayBlockingQueue
ArrayBlockingQueue是一种基于数组实现的阻塞队列。它的容量大小在创建时必须指定大小,且大小不可改变。
ArrayBlockingQueue使用单一的锁来控制访问,同样使用Condition条件变量实现等待通知机制实现多线程的并发访问。
当向一个已满的ArrayBlockingQueue中插入数据时,该操作将被阻塞直到有其它线程从队列中删除元素以腾出空间。同理,当从一个空的ArrayBlockingQueue中取数据时,该操作也将被阻塞直到有元素被放入队列。
下面是一个示例代码:
import java.util.concurrent.ArrayBlockingQueue;
public class ArrayBlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(2);
queue.put(1);
queue.put(2);
System.out.println(queue.take());
System.out.println(queue.take());
}
}
运行结果为:
1
2
LinkedBlockingQueue与ArrayBlockingQueue的异同
LinkedBlockingQueue和ArrayBlockingQueue的异同可以从几个角度来作对比。
容量大小
LinkedBlockingQueue的容量大小可以选择无限大,也可以指定有限大小,而ArrayBlockingQueue的容量大小必须在创建时确定。
插入和删除操作的锁
LinkedBlockingQueue将插入和删除操作分别在不同的锁上同步进行,而ArrayBlockingQueue使用单一的锁来控制访问。
内部存储结构
LinkedBlockingQueue是基于链表的实现,而ArrayBlockingQueue是基于数组的实现。
性能表现
由于LinkedBlockingQueue内部使用链表存储元素,因此在插入和删除操作时无需移动元素,性能较ArrayBlockingQueue更好。但LinkedBlockingQueue相对ArrayBlockingQueue在空间上更加消耗内存。
总结
如何选择LinkedBlockingQueue和ArrayBlockingQueue要根据实际需求而定。如果希望容量大小可以自动调整,在内存充足的情况下,可以选择LinkedBlockingQueue。如果对内存占用有严格要求或者希望快速执行插入和删除操作,可以选择ArrayBlockingQueue。
欢迎补充。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中LinkedBlockingQueue与ArrayBlockingQueue的异同 - Python技术站