Java中的LinkedBlockingQueue size()方法
在Java中,LinkedBlockingQueue是一个很常见的队列实现,它是一个阻塞队列,可以支持多线程的并发操作。LinkedBlockingQueue还有一个size()方法,用于返回队列中元素的个数,本文将围绕这个方法展开讨论。
LinkedBlockingQueue简介
LinkedBlockingQueue继承自BlockingQueue接口,是一个支持多线程并发操作的阻塞队列。它的实现基于链表结构,在插入和删除元素时采用的是ReentrantLock作为控制锁,能够保证同步访问的正确性。LinkedBlockingQueue既支持FIFO的队列形式,也支持LIFO的栈形式,这取决于采用的插入和删除元素的方法。下面是一个基本的LinkedBlockingQueue的示例代码。
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class TestLinkedBlockingQueue {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> queue = new LinkedBlockingQueue<>(10); //创建一个容量为10的队列
queue.put("a");
queue.put("b");
queue.put("c");
System.out.println("队列当前大小为:" + queue.size()); //输出:队列当前大小为:3
System.out.println("队首元素为:" + queue.take()); //输出:队首元素为:a
System.out.println("队列当前大小为:" + queue.size()); //输出:队列当前大小为:2
System.out.println("队首元素为:" + queue.take()); //输出:队首元素为:b
System.out.println("队列当前大小为:" + queue.size()); //输出:队列当前大小为:1
}
}
size()方法详解
LinkedBlockingQueue的size()方法是用来返回队列中元素个数的方法。
public int size() {
final ReentrantLock lock = this.lock; //获取锁
lock.lock(); //加锁
try {
Node<E> p = head; //定义一个指向头结点的节点
int n = 0; //初始元素个数为0
while (p != null) { //遍历队列
if (p.item != null)
++n;
p = p.next; //指针后移
}
return n; //返回队列中元素的个数
} finally {
lock.unlock(); //解锁
}
}
LinkedBlockingQueue的size()方法实现,基于锁的机制,使用了ReentrantLock进行控制,能够保证同步访问的正确性。方法中首先获取锁,然后从头结点开始遍历队列,累加元素的个数,最终返回队列中元素的个数。
需要注意的是,如果在多线程并发的情况下,如果一个线程执行size()方法时正在遍历队列,而另一个线程正在并发修改队列,可能导致遍历不到新的元素,从而影响结果的正确性。因此,使用size()方法时需要注意同步和线程安全。
总结
LinkedBlockingQueue是一个常见的多线程并发队列实现,size()方法用于返回队列中元素的个数。由于多线程的并发修改可能会影响遍历的结果,因此在使用size()方法时需要注意线程安全和同步问题。