Java教程

Java-多线程并发之并发队列原理剖析

本文主要是介绍Java-多线程并发之并发队列原理剖析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

CAS实现非阻塞队列ConcurrentLinkedQueue:

维护一个无边界的单向链表。非阻塞的CAS,没有加锁而是多次循环去替代阻塞的消耗,会出现弱一致性的问题。

第一次执行Peek或first会把head指向队列真正的第一个元素。

节点head和tail是volatile的(可见性保证),只需要保证操作的原子性即可。

offer(在队尾添加元素)操作:在队尾通过CAS加元素,具体方法是寻找队尾的next。如果poll操作后可能会把head变为自引用,需要重新寻找head。

如果CAS不成功就循环,牺牲CPU资源换取阻塞带来的开销。

poll(在队列头部移除一个元素):从队头开始迭代,将头节点的元素的item设置为null来移除,然后设置新的头节点。被移除的节点会被垃圾回收。如果在操作过程中头节点被修改,需要重新循环。

peek(获取队列头部元素):和poll类似,只是没删除。第一次调用peek,会删除哨兵节点,并让队列的head节点指向队列里面第一个元素或者null.

size:统计队列元素个数。因为CAS没有加锁,所以一致性不好。

remove:如果队列存在元素则删除元素,存在多个删除第一个。

contains:也是会存在不一致的问题。

 

独占锁阻塞队列LinkedBlockingQueue:

基于链接,无界的FIFO阻塞队列。

 

ArrayBlockingQueue:

 

这篇关于Java-多线程并发之并发队列原理剖析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!