ConcurrentLinkedQueue使用方法

并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法 立即下载
它是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的。
插入元素是追加到尾上。提取一个元素是从头提取。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。该队列不允许null元素。
This implementation employs an efficient "wait-free" algorithm based on one described in Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms by .
此实现采用了有效的“无等待 (wait-free)”算法,该算法基于 Maged M. Michael 和 Michael L. Scott 合著的  Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms 中描述的算法。 
Beware that, unlike in most collections, the size method is NOT a constant-time operation. Because of the asynchronous nature of these queues, 
determining the current number of elements requires a traversal of the elements.
注意和大多数集合不一样。得到元素个数所花的时间是不确定。由于该队列的异步特性,确定当前的元素数量需要遍历的元素。
This class and its iterator implement all of the optional methods of the Collection and Iterator interfaces.
这个类和它的迭代器实现了Collection和Iterator接口的所有可选方法。
Memory consistency effects: As with other concurrent collections,
actions in a thread prior to placing an object into a ConcurrentLinkedQueue happen-before actions subsequent to the access or removal of that element from the ConcurrentLinkedQueue in another thread.
内存一致性效果:和其他并发集合一样。把一个元素放入到队列的线程的优先级高与对元素的访问和移除的线程。
有三个函数需要注意的:
E     peek()
Gets but does not remove the element at the head of the queue.
E  poll()
Gets and removes the element at the head of the queue, or returns null if there is no element in the queue.
toArray
public <T> T[] toArray(T[] a)
    返回以恰当顺序包含此队列所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定的数组能容纳队列,则将该队列返回此处。否则,将分配一个具有指定数组的运行时类型和此队列大小的新数组。
    如果指定的数组能容纳队列,并有剩余的空间(即数组的元素比队列多),那么会将紧接队列尾部的元素设置为 null。
    像 toArray() 方法一样,此方法充当基于数组的 API 与基于 collection 的 API 之间的桥梁。更进一步说,此方法允许对输出数组的运行时类型进行精确控制,在某些情况下,这可以用来节省分配开销。
    假定 x 是只包含字符串的一个已知队列。以下代码用来将该队列转储到一个新分配的 String 数组:
         String[] y = x.toArray(new String[0]);
    注意,toArray(new Object[0]) 和 toArray() 在功能上是相同的。
    指定者:
        接口 Collection<E> 中的 toArray
    覆盖:
        类 AbstractCollection<E> 中的 toArray
    参数:
        a - 将用来存储队列元素的数组(如果该数组足够大);否则,将为此分配一个具有相同运行时类型的新数组 
    返回:
        包含此队列所有元素的数组 
    抛出:
        ArrayStoreException - 如果指定数组的运行时类型不是此队列中每个元素的运行时类型的超类型 
        NullPointerException - 如果指定数组为 null
size
public int size()
    返回此队列中的元素数量。如果此队列包含的元素数大于 Integer.MAX_VALUE,则返回 Integer.MAX_VALUE。
    需要小心的是,与大多数 collection 不同,此方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前的元素数需要进行一次花费 O(n) 时间的遍历。
    指定者:
        接口 Collection<E> 中的 size
    指定者:
        类 AbstractCollection<E> 中的 size
    返回:
        此队列中的元素数
注意1:
ConcurrentLinkedQueue的.size() 是要遍历一遍集合的,很慢的,所以尽量要避免用size,
如果判断队列是否为空最好用isEmpty()而不是用size来判断.
注意问题1:
使用了这个ConcurrentLinkedQueue 类之后是否意味着我们不需要自己进行任何同步或加锁操作了呢?
我在网上找到了这个:http://stackoverflow.com/questions/435069/java-util-concurrentlinkedqueue/435941 // StackOverflow果然是个好地方啊……
也就是说,如果直接使用它提供的函数,比如:queue.add(obj); 或者 queue.poll(obj);,这样我们自己不需要做任何同步。
但如果是非原子操作,比如:
   1. if(!queue.isEmpty()) {  
   2.    queue.poll(obj);  
   3. }  
我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。
所以对于这种情况,我们还是需要自己同步:
   1. synchronized(queue) {  
   2.     if(!queue.isEmpty()) {  
   3.        queue.poll(obj);  
   4.     }  
   5. }  
注意问题2:
主类
Java代码
   1. public class conn{  
   2.     public static void main(String[] args) throws Exception{  
   3.         Queue<String> queue=new ConcurrentLinkedQueue<String>();  
   4.         for(int i=0;i<1000000;i++){  
   5.            queue.add(String.valueOf(i));  
   6.         }  
   7.         int num=10;//线程人个数  
   8.         for(int i=0;i<num;i++){  
   9.            new ThreadConn(queue);  
  10.         }  
  11.   
  12.     }  
  13. } 
 线程类
Java代码
   1. public class ThreadConn implements Runnable{  
   2.     Queue<String> queue;  
   3.     public ThreadConn(Queue<String> queue){  
   4.         this.queue=queue;  
   5.         Thread thread=new Thread(this);  
   6.         thread.start();  
   7.     }  
   8.     public void run(){  
   9.         try{  
  10.             long sd=new Date().getTime();  
  11.             while(queue.poll()!=null){  
  12.                           //这里是业务逻辑  
  13.             }  
  14.             System.out.println (sn-sd);  
  15.         }catch(Exception e){  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19. }  
  测试结果如下:
启动10个线程
31
0
0
0
0
500
390
297
0
0
启动1个线程
360
10还没有1个快,如果poll这后的业务逻辑运行时间小的话,多线程序没有任何意义,
反之如果poll这后的业务逻辑运行时间相当于Thread.sleep(1);多线程确实起作用! 

ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大小, ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

/** 
     * 一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 
     * 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 
     * 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许 null 元素。 
     */  
    private void concurrentLinkedQueueTest() {  
        ConcurrentLinkedQueue<String> concurrentLinkedQueue = new ConcurrentLinkedQueue<String>();  
        concurrentLinkedQueue.add("a");  
        concurrentLinkedQueue.add("b");  
        concurrentLinkedQueue.add("c");  
        concurrentLinkedQueue.offer("d"); // 将指定元素插入到此队列的尾部。  
        concurrentLinkedQueue.peek(); // 检索并移除此队列的头,如果此队列为空,则返回 null。  
        concurrentLinkedQueue.poll(); // 检索并移除此队列的头,如果此队列为空,则返回 null。  
  
        for (String str : concurrentLinkedQueue) {  
            System.out.println(str);  
        }  
    }  
车载以太网抓包实战:100BASE-T1/1000BASE-T1高效监控方案解析 本文深入解析了车载以太网100BASE-T1/1000BASE-T1的高效抓包监控方案。针对智能汽车开发中的故障排查与性能测试需求,详细对比了交换机镜像、TAP分流和捕获模块三大主流方案的原理、核心优势与适用场景,并提供了基于实战经验的选型指南与操作避坑要点,帮助工程师精准定位网络问题。 阅读详情

相关推荐

windows10下 iperf3测试带宽

客户端输入:"iperf3.exe -u -c 服务器IP地址 -b 5g" //客户端给服务器发送udp数据包,最大带宽为5g。客户端输入:“iperf3.exe -c 服务器IP地址 -P 10“//表示客户端10路并行给服务器发送TCP包;上图可知:带宽是15Gbps(这里不知道为什么下面测试的UDP会比这里TCP慢 按道理UDP不可能比TCP慢的5.)3. 验证是否下载成功,在打开的窗口中输入“iperf3.exe -v”,会出现安装的版本,表示安装成功了。5. iperf3参数。

xiaoqixiaoguai的博客 5889

ConcurrentLinkedQueue使用和方法介绍(转载)

https://www.cnblogs.com/yangzhenlong/p/8359875.html (原文地址) 定义 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。 新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。 ...

zy103118的博客 7695

配置cts performance最优范围

这里写自定义目录标题cts例如此案例中,我们多测几次,发现Measured frame rate 的平均值为average=(380+389+380+371)/4=380 cts by VinterYoung Expected achievable frame rates for OMX.MTK.VIDEO.DECODER.HEVC video/hevc 1280x720: [75.0, 262.0]. Measured frame rate: [380.5645006622224, 389.3983545

o343196469的博客 1318

java杂谈之并发容器

常用容器 前几天和同事xhf、zm走查代码,功能是为了减少频繁你创建FTP开销用线程notify和wait实现了一个FTP池子,当时提的建议就是用java自带的线程集合实现可能更高效,本文整理下JDK自带线程安全的集合,不考虑多线程并发的情况下,容器类一般使用 ArrayList、HashMap 等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBl...

steven2xupt的博客 592

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3116

从零到一:YOLOv8在边缘设备上的轻量化部署实战

本文详细介绍了YOLOv8在边缘设备上的轻量化部署实战,涵盖模型优化、TensorRT加速、剪枝与知识蒸馏等关键技术。通过工业质检和智能门禁项目案例,展示了如何将YOLOv8高效部署到树莓派、Jetson Nano等资源受限设备,显著提升推理速度和降低内存占用。文章还提供了动态分辨率调整、多模型级联部署等实用技巧,助力开发者实现边缘AI应用的高效落地。

weixin_29040367的博客 379

并发编程ConcurrentLinkedQueue使用示例详解

构造函数中,新建了一个“内容为null的节点”,并设置表头head和表尾tail的值为新节点。head和tail是volatile类型,具有volatile赋予的含义:“即对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入”。Node中操作节点数据的API,是通过Unsafe机制的CAS函数实现的;offer(E e)的作用就是将元素e添加到链表的末尾。poll()的作用就是删除链表的表头节点,并返回被删节点对应的值。poll():在链表头部获取并且移除一个元素。

Free雅轩的博客 2121

绿联UGOS Pro系统虚拟机部署Windows 11详细教程(跳账户登录,安装内存驱动)

总的来说,此次的虚拟机部署Windows 11出现的问题应该是目前几乎所有虚拟机都可能出现的问题,和绿联是没有关系的。所以说如果你在其它NAS上虚拟机部署Windows 11系统如果出现同样的问题,那么今天教程的方案也同样适用于你。

qq_63499861的博客 1万+

Java 并发 -ConcurrentLinkedQueue详解

Java 并发 -ConcurrentLinkedQueue详解

杨宇昌的博客 5110

NVIDIA Jetson Orin系列 - 使用SDK Manager安装JetPack全流程解析

本文详细解析了使用NVIDIA官方SDK Manager为Jetson Orin系列开发板安装JetPack系统的完整流程。从环境准备、设备进入恢复模式,到SDK Manager图形化界面的分步操作指南,提供了新手友好的全流程解析,并分享了安装后的验证方法及常见问题解决方案,帮助开发者高效搭建稳定的边缘AI开发环境。

nn3456的博客 406

【LAMMPS学习】四、运行 LAMMPS(2)命令行选项

本部分解释了在安装可执行文件或下载源代码并构建可执行文件后如何运行 LAMMPS。命令文档页面描述了输入脚本的结构以及它们可以包含的命令。

荷塘阅色 5242

ConcurrentLinkedQueue(并发队列)

ConcurrentLinkedQueue(并发队列)

隔壁老杨的专栏 2098

YOLOv11改进 - C3k2融合 | C3k2融合细节增强卷积DEConv(Detail-Enhanced Convolution)提升细微特征提取能力

本文介绍了细节增强卷积(DEConv)技术在YOLOv11中的结合应用。DEConv由标准卷积层和多种差异卷积层并行组成,通过计算像素差异和卷积操作增强特征提取能力,还采用重参数化技术简化模型结构。其优势在于能更好捕捉高频信息、保持参数数量不变且降低推理计算成本。我们将DEConv集成进YOLOv11,替换部分模块。

魔改工程师的博客 862

ConcurrentLinkedQueue的offer方法

1、构造函数 public ConcurrentLinkedQueue() { head = tail = new Node<E>(null); } 点击new Node(null)进入如下代码 Node(E item) { UNSAFE.putObject(this, itemOffset, item); } 这里的itemOffset是item这个属性相对于No...

zjuwzp的博客 3610

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ConcurrentLinkedQueue的简单使用方法

ConcurrentLinkedQueue 队列:先进先出。 主要使用的方法: offer :用于插入元素,返回值是boolean 表示成功与否。 add :用于插入元素,返回值是boolean 表示成功与否。 poll :检索并删除此队列的头,如果此队列为空,则返回null。 peek :检索但是不删除此队列的头,如果此队列为空,则返回null。 isEmpty :返回队列是是否为空。 size :返回队列的大小。 contains :返回队列中是否包含这一元素。 clear :..

xkyy66的博客 801

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

ConcurrentLinkedQueue使用和方法介绍

转自:http://www.cnblogs.com/yangzhenlong/p/8359875.html ConcurrentLinkedQueue使用和方法介绍 定义 一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。 新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。...

曹恭铖的博客 522

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ConcurrentLinkedQueue常用方法:

ConcurrentLinkedQueue常用方法: 增: add :底层调用offer offer : 将指定元素插入此队列的尾部 删: poll 是从队列取出元素并且删除该元素 remove 如果此元素不存在,则返回 false,移除成功返回true 读: peek() 获取但不移除此队列的头;如果此队列为空,则返回 null contains(Object o) 如果此队列...

远方 656

ConcurrentLinkedQueue常用方法

ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue(); for (int i = 0; i < 100; i++){ queue.add(i); } //获取元素 不移除头结点 System.out.println(queue.peek()); //返回在此队列元素上以恰当顺序进行迭代的迭代...

dreamzuora的博客 466

ConcurrentLinkedQueue中offer与poll方法源码分析

ConcurrentLinkedQueue中offer与poll方法源码分析 前言 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown

weixin_39879846的博客 2701
上一篇: Java并发包探秘 (一) ConcurrentLinkedQueue
下一篇: 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值