当前位置:首页 > 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

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

相关文章

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能,可以利用数组的 push 和 shift 方法模拟队列的先进先出(FIFO)特性。以下是一个简单的实现示例: <template>…

vue实现请求加锁

vue实现请求加锁

请求加锁的实现方式 在Vue中实现请求加锁通常是为了防止重复提交或并发请求导致的数据不一致问题。以下是几种常见的实现方法: 使用标志位控制请求状态 在组件或Store中定义一个布尔类型的标志位(如i…

php实现双向队列

php实现双向队列

PHP 实现双向队列的方法 双向队列(Deque,Double-ended Queue)是一种允许在队列两端进行插入和删除操作的数据结构。PHP 中可以通过数组或 SplDoublyLinkedLis…

php 消息队列 实现

php 消息队列 实现

PHP 消息队列实现方法 使用 Redis 实现消息队列 Redis 的 LPUSH 和 BRPOP 命令可以轻松实现消息队列功能。生产者通过 LPUSH 将消息推入队列,消费者通过 BRPOP 阻…

php实现redis消息队列

php实现redis消息队列

安装 Redis 扩展 确保 PHP 已安装 Redis 扩展。可以通过以下命令安装: pecl install redis 在 php.ini 中添加 extension=redis.so 并重启…

php redis实现消息队列

php redis实现消息队列

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