`
kanpiaoxue
  • 浏览: 1782242 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

元素唯一的LinkedBlockingQueue阻塞队列

 
阅读更多

最近看见以前的一段代码,就粘了出来。这就是一个简单的阻塞队列,它继承了JDK原有的LinkedBlockingQueue,它也是线程安全的。与LinkedBlockingQueue不同的地方在于,UniqueLinkedBlockingQueue队列里面不允许出现重复性元素。该队列可以在很多场景中适用,比如:

多生产者的情形下,一起向队列中存放任务,这些任务不允许在队列里面出现重复,就可以使用这个队列。

代码如下:

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

/**
 * <pre>
 * UniqueLinkedBlockingQueue.java
 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年8月7日 下午1:32:31<br>
 * Description : 元素唯一的LinkedBlockingQueue阻塞队列
 * </pre>
 */
public class UniqueLinkedBlockingQueue<E> extends LinkedBlockingQueue<E> {

    private static final long serialVersionUID = 6523405086129214113L;
    private final ReentrantLock putLock = new ReentrantLock();

    public void put(E e) throws InterruptedException {
        putLock.lock();
        try {
            if (!contains(e)) {
                super.put(e);
            }
        } finally {
            putLock.unlock();
        }
    }
}

 

分享到:
评论

相关推荐

    生产者/消费者模式 阻塞队列 LinkedBlockingQueue

    同时,作为阻塞队列,当生产者尝试向满队列添加元素时,或者消费者尝试从空队列中获取元素时,线程会被阻塞,直到队列有可用空间或数据,这大大简化了多线程同步的问题。 在生产者/消费者模式中,生产者通常通过`...

    支持多线程和泛型的阻塞队列

    在Java中,`java.util.concurrent`包提供了多种阻塞队列实现,如`ArrayBlockingQueue`, `LinkedBlockingQueue`等。它们都实现了`BlockingQueue`接口,提供了一套线程安全的方法来添加和移除元素,如`put()`, `take()...

    并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法

    ### 并发队列 ConcurrentLinkedQueue 和阻塞队列 LinkedBlockingQueue 用法详解 #### 一、并发队列 ConcurrentLinkedQueue 概述 `ConcurrentLinkedQueue` 是 Java 并发包 `java.util.concurrent` 提供的一个高性能...

    并发-线程池和阻塞队列.pdf

    Java中的ArrayBlockingQueue和LinkedBlockingQueue都是典型的阻塞队列实现。 阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者...

    阻塞队列阻塞队列阻塞队列

    LinkedBlockingQueue是基于链表结构实现的阻塞队列,其内部节点为Node类,包含元素值和指向下一个节点的引用。与ArrayBlockingQueue不同,LinkedBlockingQueue的容量可以是Integer.MAX_VALUE(即无界队列),也可以...

    14-阻塞队列BlockingQueue实战及其原理分析二.pdf

    2. LinkedBlockingQueue:使用链表作为底层数据结构的阻塞队列。 3. SynchronousQueue:一个不存储元素的阻塞队列,生产者和消费者需要同时存在。 4. PriorityBlockingQueue:一个带有优先级的阻塞队列,元素的...

    java模拟阻塞队列

    当队列已满,调用此方法的线程会被阻塞,直到有其他线程从队列中取出一个元素。 2. `take`方法:消费者用来从队列头部移除并返回元素。如果队列为空,调用此方法的线程会被阻塞,直至队列中有元素可用。 3. `offer`...

    并发-线程池和阻塞队列

    常见的阻塞队列实现包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。阻塞队列常被用作线程池的工作队列,连接生产者(添加任务的线程)和消费者(执行任务的线程),实现任务的异步处理。 ...

    Java实现简单的阻塞队列2种方式

    阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足为止。本文将探讨两种实现简单阻塞队列的方法:使用`wait()`和`notify()`以及使用`CountDownLatch`。 1. 使用`wait...

    阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt

    阻塞队列的主要特点在于它支持两个额外的条件操作:当队列为空时,尝试从队列中取元素的操作会被阻塞,直到队列中出现新的元素;同样地,当队列已满时,尝试向队列中添加元素的操作也会被阻塞,直到队列中出现可用...

    10、阻塞队列BlockingQueue实战及其原理分析

    阻塞队列的核心特性在于其“阻塞”行为:当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程插入一个元素;当队列满时,尝试插入元素的线程会被阻塞,直到其他线程消费了一个元素。这种设计极大地简化了多线程...

    10、阻塞队列BlockingQueue实战及其原理分析.pdf

    2. **LinkedBlockingQueue**:基于链表结构实现的无界阻塞队列,也可通过构造函数指定容量大小变为有界队列。 3. **PriorityBlockingQueue**:支持按优先级排序的无界阻塞队列。 4. **DelayQueue**:基于优先级队列...

    linkedblockingqueue

    2. `take()`:获取并移除队首元素,如果队列为空,调用此方法的线程将被阻塞,直到队列中有元素。 3. `offer(E e, long timeout, TimeUnit unit)`:尝试插入元素,如果队列已满,可以等待指定时间,时间到仍无法...

    并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解

    * items数组:用于存储队列元素 * takeIndex和putIndex:分别表示队列的take和put索引 * count:表示队列中当前元素个数 * lock:ReentrantLock实例,用于保护队列操作 * notEmpty和notFull:Condition实例,用于...

    java阻塞队列实现原理及实例解析.docx

    在Java中,自Java 5.0起,`java.util.concurrent`包提供了多种阻塞队列的实现,例如`ArrayBlockingQueue`、`LinkedBlockingQueue`、`PriorityBlockingQueue`等。这些类都实现了`java.util.concurrent.BlockingQueue`...

    java线程聊天室(阻塞队列实现)

    在Java中,阻塞队列的实现类包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。它们都实现了BlockingQueue接口,提供了put()和take()方法,分别用于插入和移除元素,这两个方法在队列满或空时...

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    2. **队列实现**:接着可能会讲解几种具体的阻塞队列实现,比如`ArrayBlockingQueue`是基于数组的有界队列,`LinkedBlockingQueue`基于链表,以及`PriorityBlockingQueue`是无界的优先级队列,它们各自的特点和适用...

    剖析Java中阻塞队列的实现原理及应用场景

    阻塞队列的核心特性在于当队列为空时,尝试获取元素的线程会被阻塞,直到队列中有元素可用;同样,当队列满时,尝试添加元素的线程也会被阻塞,直到队列有空间。这种机制避免了额外的同步和唤醒操作,简化了编程模型...

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    2. `LinkedBlockingQueue`: 基于链表结构的阻塞队列,容量可以无限大,但内部维护了一个容量参数来控制性能。 3. `PriorityBlockingQueue`: 一个无界的阻塞队列,其中元素按照优先级进行排序。 4. `DelayQueue`: 一...

Global site tag (gtag.js) - Google Analytics