Java ArrayBlockingQueue, SynchronousQueue

BlockingQueue接口定义了一种阻塞的FIFO queue,每一个BlockingQueue都有一个容量,让容量满时往BlockingQueue中添加数据时会造成阻塞;当容量为空时取元素操作会阻塞。

SynchronousQueue是这样 一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在; 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试添加到队列中的首个已排队线程元素; 如果没有已排队线程,则不添加元素并且头为 null

SynchronousQueue、LinkedBlockingQueueArrayBlockingQueueJava 中用于实现线程安全的队列的类。 SynchronousQueue 是一个没有容量的队列,它的主要特点是生产者线程在放入元素后会被阻塞,直到有消费者线程从队列中取出该元素。同样地,消费者线程在尝试取出元素时也会被阻塞,直到有生产者线程放入元素。SynchronousQueue 主要用于实现线程之间的直接传输,用于传递元素而不是存储元素。 LinkedBlockingQueue 是一个基于链表的有界队列,它的容量是可选的,如果没有指定容量,则默认为 Integer.MAX_VALUE。LinkedBlockingQueue 的特点是,它支持生产者和消费者线程的并发访问,并且可以指定在队列为空时的阻塞行为和在队列满时的阻塞行为。它使用两个锁来实现并发访问,可以同时有多个生产者和消费者线程访问队列。 ArrayBlockingQueue 是一个基于数组的有界队列,它的容量是固定的。ArrayBlockingQueue 的特点是,它支持生产者和消费者线程的并发访问,并且可以指定在队列为空时的阻塞行为和在队列满时的阻塞行为。它使用单个锁来实现并发访问,只能有一个线程访问队列。 这三个类都是线程安全的,可以在多线程环境下使用。选择使用哪个类取决于你的需求,如果需要实现生产者和消费者之间的直接传输,可以使用 SynchronousQueue;如果需要一个可选容量的队列,并且希望使用链表实现,可以使用 LinkedBlockingQueue;如果需要一个有固定容量的队列,并且希望使用数组实现,可以使用 ArrayBlockingQueue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值