Java中的ConcurrentLinkedQueue以及示例

Java中的ConcurrentLinkedQueue以及示例

ConcurrentLinkedQueue是Java 5中引入的一种并发性较好的队列,它遵循FIFO(先进先出)原则,同时支持并发环境下的高并发读写操作。

下面我们将围绕ConcurrentLinkedQueue展开详细介绍,并提供使用示例。

ConcurrentLinkedQueue的概述

ConcurrentLinkedQueue的底层采用链表数据结构来存储元素,支持在队首和队尾插入和删除元素,各自保持独立的指针,从而实现并发读写操作。

值得注意的是,ConcurrentLinkedQueue不支持null元素。

ConcurrentLinkedQueue主要方法介绍

ConcurrentLinkedQueue提供了以下主要方法:

  • add(E e): 添加元素,返回true或抛出异常
  • offer(E e): 添加元素,返回true或false
  • poll(): 获取并删除队首元素,队列为空时返回null
  • peek(): 获取队首元素但不删除,队列为空时返回null
  • size(): 返回队列元素个数

注:在并发环境下,使用size()方法的结果并不可靠,因为在执行size()的同时插入或删除操作可能发生,导致结果不准确。因此,通常情况下,我们需要自己维护一个变量来保存队列元素个数。

ConcurrentLinkedQueue使用示例

在使用ConcurrentLinkedQueue之前,我们需要先引入它:

import java.util.concurrent.ConcurrentLinkedQueue;

然后我们就可以创建一个ConcurrentLinkedQueue对象并添加元素了:

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.add("element1");
queue.add("element2");
queue.add("element3");

下面是一个完整的使用示例:

import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueDemo {
    public static void main(String[] args) {

        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
        queue.add("element1");
        queue.offer("element2");
        queue.add("element3");
        queue.offer("element4");

        System.out.println("队列中的元素个数:" + queue.size());

        System.out.println("队首元素:" + queue.peek());
        System.out.println("队首元素并删除:" + queue.poll());

        System.out.println("队列中的元素个数:" + queue.size());

        for (String str : queue) {
            System.out.println("遍历元素:" + str);
        }
    }
}

运行结果如下:

队列中的元素个数:4
队首元素:element1
队首元素并删除:element1
队列中的元素个数:3
遍历元素:element2
遍历元素:element3
遍历元素:element4

ConcurrentLinkedQueue的性能测试

我们可以通过下面的测试程序对ConcurrentLinkedQueue的性能进行简单测试:

import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueuePerformanceTest {

    public static void main(String[] args) {

        ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 10000000; i++) {
            queue.offer(i);
        }

        long enqueueTime = System.currentTimeMillis() - startTime;
        System.out.println("入队时间:" + enqueueTime + "ms");

        startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            queue.poll();
        }

        long dequeueTime = System.currentTimeMillis() - startTime;
        System.out.println("出队时间:" + dequeueTime + "ms");
    }
}

对于10000000个元素的插入和删除操作,得到的结果如下:

入队时间:223ms
出队时间:263ms

可以看出,ConcurrentLinkedQueue的性能还是比较不错的。

结论

ConcurrentLinkedQueue是Java并发编程中很常用的一个基本工具,通过本文,我们了解了它的概述、主要方法、使用示例以及性能测试。在实际开发中,我们可以根据自己的需要,选择合适的数据结构来进行并发操作,以提高程序的性能和可靠性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程