当前位置:首页 > Java

java队列如何加锁

2026-03-22 06:47:39Java

加锁实现线程安全队列

在Java中实现线程安全的队列通常可以通过内置的并发队列或手动加锁机制完成。以下是两种常见方法:

使用java.util.concurrent包中的并发队列 Java提供了多种线程安全的队列实现,如ConcurrentLinkedQueue(非阻塞)、LinkedBlockingQueue(阻塞)和ArrayBlockingQueue(阻塞)。这些队列内部已经实现了线程安全机制,无需手动加锁。

java队列如何加锁

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.offer("item"); // 线程安全的入队操作
String item = queue.poll(); // 线程安全的出队操作

手动加锁实现同步队列 如果需要自定义队列行为,可以使用ReentrantLocksynchronized关键字实现同步:

java队列如何加锁

import java.util.LinkedList;
import java.util.concurrent.locks.ReentrantLock;

public class LockedQueue<T> {
    private final LinkedList<T> list = new LinkedList<>();
    private final ReentrantLock lock = new ReentrantLock();

    public void enqueue(T item) {
        lock.lock();
        try {
            list.addLast(item);
        } finally {
            lock.unlock();
        }
    }

    public T dequeue() {
        lock.lock();
        try {
            return list.isEmpty() ? null : list.removeFirst();
        } finally {
            lock.unlock();
        }
    }
}

使用synchronized关键字

对于简单的同步需求,可以直接使用synchronized修饰方法或代码块:

public class SynchronizedQueue<T> {
    private final LinkedList<T> list = new LinkedList<>();

    public synchronized void enqueue(T item) {
        list.addLast(item);
    }

    public synchronized T dequeue() {
        return list.isEmpty() ? null : list.removeFirst();
    }
}

条件变量实现阻塞队列

当需要实现生产者-消费者模型时,可以结合ReentrantLockCondition实现阻塞等待:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class BlockingLockedQueue<T> {
    private final LinkedList<T> list = new LinkedList<>();
    private final ReentrantLock lock = new ReentrantLock();
    private final Condition notEmpty = lock.newCondition();

    public void enqueue(T item) {
        lock.lock();
        try {
            list.addLast(item);
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public T dequeue() throws InterruptedException {
        lock.lock();
        try {
            while (list.isEmpty()) {
                notEmpty.await();
            }
            return list.removeFirst();
        } finally {
            lock.unlock();
        }
    }
}

锁的选择建议

  • 高并发场景优先选择ConcurrentLinkedQueueLinkedBlockingQueue
  • 需要公平性时使用ReentrantLock(true)创建公平锁
  • 简单同步需求使用synchronized更简洁
  • 需要精细控制等待/唤醒机制时选择Condition

标签: 队列加锁
分享给朋友:

相关文章

php redis实现消息队列

php redis实现消息队列

使用 PHP 和 Redis 实现消息队列 Redis 是一个高性能的键值存储系统,支持多种数据结构,如列表(List)、发布/订阅(Pub/Sub)等,非常适合实现消息队列。以下是几种常见的实现方式…

php 实现消息队列

php 实现消息队列

PHP 实现消息队列的方法 使用 Redis 实现消息队列 Redis 的 List 结构可以用于实现简单的消息队列。通过 LPUSH 和 RPOP 命令可以实现先进先出的队列。 $redis =…

php 队列实现

php 队列实现

使用数据库实现队列 在PHP中可以通过数据库表模拟队列行为,创建包含id、data、status和created_at字段的表。插入数据时状态设为pending,消费时更新为processing,完成…

js 实现异步队列

js 实现异步队列

异步队列的实现方法 在 JavaScript 中,实现异步队列可以通过多种方式,以下是几种常见的方法: 使用 Promise 链式调用 通过 Promise 的链式调用可以确保异步任务按顺序执行。每…

js实现队列

js实现队列

队列的基本概念 队列是一种遵循先进先出(FIFO)原则的线性数据结构。元素从队尾入队,从队头出队,操作包括enqueue(入队)、dequeue(出队)、peek(查看队头元素)和isEmpty(判断…

js 实现消息队列

js 实现消息队列

实现消息队列的基本概念 消息队列是一种异步通信机制,允许不同的应用程序或组件通过发送和接收消息来交互。在JavaScript中,可以使用数组、对象或第三方库来实现消息队列的功能。 使用数组实现简单消…