java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列

Posted 西北野狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列相关的知识,希望对你有一定的参考价值。

 ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法(即CAS算法)来实现。

阻塞队列BlockingQueue:

  1. 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。
  2. 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。

Java里的阻塞队列

  1. ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序,不保证线程公平的访问队列;
  2. LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列,FIFO先进先出。
  3. PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
  4. DelayQueue:是一个支持延时获取元素的无界阻塞队列。
  5. SynchronousQueue:一个不存储元素的阻塞队列。
  6. LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  7. LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

ArrayBlockingQueue 通过 ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);保证线程公平访问队列。

看下构造方法:

  public ArrayBlockingQueue(int capacity, boolean fair) {
        if (capacity <= 0)
            throw new IllegalArgumentException();
        this.items = new Object[capacity];
        lock = new ReentrantLock(fair);
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }

使用可重入锁实现。

DelayQueue使用场景:

  1. 缓存系统设计;
  2. 定时任务调度;

 

以上是关于java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程 4.线程池

什么是JAVA的多线程?

Java多线程 1.认识Java线程

Java多线程 5.栅栏

java 如何实现多线程

java中啥叫做线程?啥叫多线程?多线程的特点是啥