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. 执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。

java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列相关推荐

  1. java多线程11.非阻塞同步机制

    关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...

  2. ConcurrentLinkedQueue非阻塞无界链表队列

    ConcurrentLinkedQueue非阻塞无界链表队列  ConcurrentLinkedQueue是一个线程安全的队列,基于链表结构实现,是一个无界队列,理论上来说队列的长度可以无限扩大. 与 ...

  3. Java多线程案例之阻塞队列

    ⭐️前面的话⭐️ 本篇文章将介绍Java多线程案例,阻塞队列,阻塞队列在普通队列的基础上多了两种情况,一是阻塞队列为空时,如果进行出队操作,会使当前线程阻塞,直到有新元素插入阻塞队列,该线程才被通知继 ...

  4. 非阻塞线程安全列表——ConcurrentLinkedDeque应用举例

    转载自  非阻塞线程安全列表--ConcurrentLinkedDeque应用举例 在java中,最常用的数据结构可能是列表.有数目不详的元素列表,你可以添加.阅读.或删除任何位置的元素.此外,并发列 ...

  5. Java多线程(七)——线程中断

    目录 一.引言 二.stop与interrupt 三.非阻塞线程被interrupt 四.阻塞线程被interrupt 五.总结 一.引言 线程中断在开始没有特别重视,多线程往后学习才发现线程中断也是 ...

  6. Java多线程基础-6:线程安全问题及解决措施,synchronized关键字与volatile关键字

    线程安全问题是多线程编程中最典型的一类问题之一.如果多线程环境下代码运行的结果是符合我们预期的,即该结果正是在单线程环境中应该出现的结果,则说这个程序是线程安全的. 通俗来说,线程不安全指的就是某一代 ...

  7. 并发集合(二)使用非阻塞线程安全的列表

    使用非阻塞线程安全的列表 列表(list)是最基本的集合.一个列表有不确定的元素数量,并且你可以添加.读取和删除任意位置上的元素.并发列表允许不同的线程在同一时刻对列表的元素进行添加或删除,而不会产生 ...

  8. Java 多线程(三) 线程的生命周期及优先级

    Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程. 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: ...

  9. Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口.但是我们创建这两种线程在运行结束后都会被 ...

最新文章

  1. linux 自动ping脚本,linux上ping脚本及zabbix3.xx上自动发现
  2. 0自动转型到DBNull.Value引发的错误
  3. 堆和栈的概念和区别 python_堆和栈的区别是啥?
  4. 自学python 编程基础科学计算及数据分析 pdf_自学Python:编程基础、科学计算及数据分析...
  5. PS2021要求计算机配置,Photoshop2021体验:傻瓜操作体验下系统需求大大增加!
  6. 计算机没考好的检讨书300百以上,考试没考好的万能检讨书300字(精选5篇)
  7. 【蓝桥杯】 三行代码解决 “全排列的价值”(2022省赛pythonA组)
  8. 老兵不死:Radionomy正式宣布收购Winamp
  9. Oracle 12CR2 安装配置与基础学习
  10. 【阿里云生活物联网架构师专题 ⑥】ESP8266接入阿里生活飞燕平台国际版,实现亚马逊Alexa Echo音响语音控制;
  11. DM6437(DSP)图像处理常用操作源码
  12. 某些型号的Comba和D-Link路由器存在管理员密码泄露漏洞
  13. activiti设计器会签人员配置
  14. PL/SQL语言简单案例
  15. 解决svn报错:svn: Working copy 'D:\02_workplace\udp\WebRoot\Backstage\Sysi' locked; try performing 'clean
  16. (数据科学学习手札32)Python中re模块的详细介绍
  17. SCons教程(3) 编译程序
  18. Jemter+Badboy实战经验一(Badboy录制及基础功能)
  19. 软件开发生命周期各阶段的任务
  20. JS 每日一题 #13

热门文章

  1. 为什么剩余数不能相加_为什么各位之和是 3 的倍数的数能被 3 整除?
  2. 面对非线性可分的情况怎么处理
  3. C语言手撸搜索(查找)二叉树---创建,插入,删除
  4. 谭浩强课后题之----水仙花数
  5. python实现八皇后问题(百练OJ:2754:八皇后)
  6. Absernt line Number Information
  7. 新概念0804:潘石屹学习python
  8. 《系统集成项目管理工程师》必背100个知识点-51项目人力资源管理
  9. 不知道Gartner是干啥的?看看这里就知道了!
  10. Leaflet中使用Leaflet.Path.Transform插件实现旋转图形