700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java多线程 --ConcurrentLinkedQueue 非阻塞 线程安全队列

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

时间:2022-09-18 10:10:44

相关推荐

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

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= newReentrantLock(fair);notEmpty = lock.newCondition();notFull = lock.newCondition();}

使用可重入锁实现。

DelayQueue使用场景:

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

SynchronousQueue是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。

它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。

SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。

Fork Join框架:

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

工作窃取算法:

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

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

框架设计:

分割任务。首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停地分割,直到分割出的子任务足够小。执行任务并合并结果。分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。