Java并发编程之ConcurrentLinkedQueue队列详情

Java并发编程之ConcurrentLinkedQueue队列详情

什么是ConcurrentLinkedQueue

ConcurrentLinkedQueue是Java中的一个并发数据结构,基于链表实现,用来维护一组元素,采用无锁算法CAS保证线程安全,被广泛应用于多线程编程场景中。

操作模式

ConcurrentLinkedQueue操作模式是先进先出,和ArrayList、LinkedList的操作模式是一致的。

常用方法

  • add(e): 将元素e添加到队列尾部
  • offer(e): 将元素e添加到队列尾部,执行成功返回true,如果队列体积已满,则返回false
  • poll(): 移除并返回队列头部元素,如果队列为空,则返回null
  • peek(): 返回队列头部元素,如果队列为空,则返回null

示例1

再看一个示例:向ConcurrentLinkedQueue队列中添加和取出元素

import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueExample {
    public static void main(String[] args) {
        ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();

        // 添加元素
        queue.add(1);
        queue.offer(2);

        // 获取元素并打印
        System.out.println(queue.poll());
        System.out.println(queue.peek());
    }
}

输出:

1
2

示例2

再看一个示例:ConcurrentLinkedQueue多线程操作

import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueExample2 {
    public static void main(String[] args) {
        ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
        Thread producerThread = new Thread(new Producer(queue));
        Thread consumerThread = new Thread(new Consumer(queue));
        producerThread.start();
        consumerThread.start();
    }
}

class Producer implements Runnable {
    private final ConcurrentLinkedQueue<Integer> queue;

    public Producer(ConcurrentLinkedQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            queue.add(i);
            System.out.println("Produce " + i);
            try {
                Thread.sleep((int)(Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable {
    private final ConcurrentLinkedQueue<Integer> queue;

    public Consumer(ConcurrentLinkedQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            Integer value = queue.poll();
            if (value == null) {
                System.out.println("Consumer wait");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                value = queue.poll();
            }
            System.out.println("Consume " + value);
            try {
                Thread.sleep((int)(Math.random() * 2000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出:

Produce 0
Consumer wait
Produce 1
Consumer wait
Produce 2
Consume 0
Consume 1
Consume 2
Produce 3
Produce 4
Consumer wait
Produce 5
Consume 3
Produce 6
Consume 4
Produce 7
Consume 5
Produce 8
Consume 6
Produce 9
Consume 7
Consume 8
Consume 9

这个例子展示了ConcurrentLinkedQueue的高并发特性,当生产速度快于消费速度时,消费线程会等待,直到生产完成。当消费速度快于生产速度时,生产线程会等待,直到消费完成。这个例子充分体现了ConcurrentLinkedQueue的无阻塞特性,由于没有锁的完全互斥,因此多线程并发操作时效率更高。

总结

本文介绍了Java中ConcurrentLinkedQueue队列的基本概念、优点,以及常用方法示例。对于多线程下队列的一些处理,是使用ConcurrentLinkedQueue的理想场景。不仅可以避免因加锁对性能的影响,而且可以最大程度的避免出现死锁的现象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java并发编程之ConcurrentLinkedQueue队列详情 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Pthread并发编程之线程基本元素和状态的剖析

    Pthread并发编程之线程基本元素和状态的剖析 线程的基本概念 在Pthread中,线程是操作系统调度的基本单位。一个进程可以包含多个线程,共享进程的资源。 可以通过Pthread库提供的函数来创建、销毁、等待、同步线程。 线程的创建和销毁 Pthread库提供了pthread_create()函数用来创建线程,同时需要指定线程的入口函数、参数等参数。 线…

    多线程 2023年5月16日
    00
  • 详解超线程、多核、多处理器的区别

    详解超线程、多核、多处理器的区别 在讨论超线程、多核、多处理器之间的区别之前,我们需要了解计算机中的两个重要概念:线程和核心。 线程:计算机中执行任务的最小单位,是CPU执行指令和操作的基本单元。每个CPU核心可以同时执行多个线程。 核心:计算机的核心是处理器中的一个物理处理单元,它可用于执行任何指令并完成基本的算术或逻辑运算。 现在让我们深入了解超线程、多…

    多线程 2023年5月17日
    00
  • java并发之synchronized

    Java 并发之 synchronized 在 Java 中,我们可以使用 synchronized 来保证多线程程序的线程安全。本文将介绍 synchronized 的使用方式和注意事项。 synchronized 使用方式 synchronized 有三种使用方式: 1. 修饰实例方法 public synchronized void method() …

    多线程 2023年5月16日
    00
  • 详细分析Java并发集合ArrayBlockingQueue的用法

    下面是详细的攻略: Java并发集合ArrayBlockingQueue的用法分析 1. 简介 ArrayBlockingQueue是Java中的一个并发集合,是线程安全的,可以在生产者和消费者之间传递数据。它是一个有界队列,具有固定的大小,即在构造时指定队列的容量。 2. 常用方法 ArrayBlockingQueue有许多常用的方法,下面是其中的一些: …

    多线程 2023年5月16日
    00
  • Kotlin协程与并发深入全面讲解

    Kotlin协程与并发深入全面讲解 什么是Kotlin协程 Kotlin协程是一种轻量级的、并发的、以及非阻塞的编程模式,它可以让我们在某些场景下更加有效地利用线程资源实现异步编程。 Kotlin协程的特点 能够高效地使用线程资源,避免了线程的频繁创建与销毁 简洁、灵活、易用 同步与异步代码的无缝转换,提供了统一的编程模型 支持取消操作,使其可以更好地处理长…

    多线程 2023年5月16日
    00
  • 聊聊SpringBoot的@Scheduled的并发问题

    下面是详细讲解SpringBoot的@Scheduled的并发问题的完整攻略。 什么是@Scheduled @Scheduled是Spring框架中用于定时任务的注解。使用该注解可以实现在指定的时间间隔或特定时间执行代码块。 @Schedule的并发问题 在使用@Scheduled注解时,可能会出现并发的问题。在Spring Boot 2.x版本中,@Sch…

    多线程 2023年5月17日
    00
  • Java 并发编程的可见性、有序性和原子性

    Java 并发编程的可见性、有序性和原子性是非常重要的概念和技能,在实际开发中必须掌握。本文将具体讲解这方面的知识。 可见性 所谓可见性,是指当多个线程同时访问共享变量时,一个线程修改了该变量的值,其他线程能够立即看到这个变化。在 Java 并发编程中,如果没有采取特殊的措施,共享变量的修改并不一定对所有线程都可见,这样就可能造成线程安全问题。 为了保证可见…

    多线程 2023年5月16日
    00
  • java ReentrantLock并发锁使用详解

    Java中的ReentrantLock是一种高级的并发锁机制,它比synchronized关键字更加灵活、功能更加强大。ReentrantLock提供了比synchronized更多的锁定操作和更细粒度的控制,可以更好地支持高级并发系统。 以下是ReentrantLock的详细使用攻略: 1. 导入ReentrantLock类 首先需要在Java项目中导入R…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部