java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列
2023-09-14 08:59:00 时间
ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。它采用了“wait-free”算法(即CAS算法)来实现。
阻塞队列BlockingQueue:
- 支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。
- 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。
Java里的阻塞队列
- ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序,不保证线程公平的访问队列;
- LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列,FIFO先进先出。
- PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
- DelayQueue:是一个支持延时获取元素的无界阻塞队列。
- SynchronousQueue:一个不存储元素的阻塞队列。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
- 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使用场景:
- 缓存系统设计;
- 定时任务调度;
SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。
它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。
SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。
Fork Join框架:
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
工作窃取算法:
优点:充分利用线程并行计算,减少线程间竞争。
缺点:在某些情况下还是存在竞争,比如双端队列里只有一个任务时。并且该算法会消耗了更多的系统资源,比如创建多个线程和多个双端队列。
框架设计:
- 分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停地分割,直到分割出的子任务足够小。
- 执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。
相关文章
- java删除文件目录及文件_Java删除文件,目录
- idea如何运行Java Web项目(Servlet、JSP)
- java 构造器 构造方法_Java构造器(构造方法/constructor)
- java文件上传
- java socket详解_Java Socket 编程原理及教程「建议收藏」
- java把string转int类型_java把String类型转换为int类型的方法
- JAVA代码审计之java反序列化
- Java中使用fastjson解析json数据方法
- 超详细解读Java接口:模块通信协议以及默认方法和静态方法
- java并发编程(2):Java多线程-java.util.concurrent高级工具
- 使用DOMParser 解析xml的Java代码详解编程语言
- 40个Java多线程问题总结,新手必备详解编程语言
- java获取json格式中的值详解编程语言
- Java HttpClient PostMethod详解编程语言
- 主流Java ORM框架有哪些?
- 数据处理Java中Redis数据的过期处理方法(redisjava过期)
- 设置使用Java实现Redis缓存数据的自动过期策略(redisjava过期)
- 构建Java应用程序中Redis集群的方法(java连redis集群)
- Java连接MySQL:实现数据库操作(java中连接mysql)
- 程序Oracle调用Java程序的实现方法(oracle调用java)
- Java与Oracle 一种天生的结合(java属于oracle)
- 学习Java编程,攻克Oracle难题(java学oracle)
- 安装Oracle JDK 从Java进入下一个级别(oracle下载java)
- java多线程应用实现方法