• 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. 定时任务调度;

    SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。
    它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。
    SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。

    Fork Join框架:

    Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。

    工作窃取算法:

    优点:充分利用线程并行计算,减少线程间竞争。

    缺点:在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且该算法会消耗了更多的系统资源,比如创建多个线程和多个双端队列。

    框架设计:

    1. 分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停地分割,直到分割出的子任务足够小。
    2. 执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。
  • 相关阅读:
    MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
    Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6
    在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。
    PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
    Windows下PHP版本选取
    简单配置nginx使之支持pathinfo
    PHP如何关闭notice级别的错误提示
    php开启pathinfo 模式
    php 5.3新增的闭包语法介绍function() use() {}
    Object.prototype.toString.call() 区分对象类型
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/6639410.html
Copyright © 2020-2023  润新知