当我们有 LinkedBlockingQueue 时,为什么还要使用 ConcurrentLinkedQueue?

2024-03-22

我为什么要使用ConcurrentLinkedQueue当我有LinkedBlockingQueue?我知道ConcurrentLinkedQueue是非阻塞的但是LinkedBlockingQueue可以作为ConcurrentLinkedQueue。我会用put()/offer()插入方法和poll()去除方法。poll()如果队列为空,方法不会等待。LinkedBlockingQueue也是无界的。所以我可以用这个。

到目前为止我发现的区别是ConcurrentLinkedQueue使用具有比较和交换功能的硬件级同步机制LinkedBlockingQueue正在使用ReentrantLock.


主要区别在于ConcurrentLinkedQueue is 免等待,不仅仅是无锁 (有什么不同? https://en.wikipedia.org/wiki/Non-blocking_algorithm) while LinkedBlockingQueue本质上必须保持锁定。

你可以建模ConcurrentLinkedQueue with LinkedBlockingQueue and poll,但实现仍将保持锁定状态,从而减少系统的并发性。

这是一个公认的不精确的微基准测试,它检查在没有阻塞的情况下通过两个并发队列中的每一个传递 10,000 个对象的速度,并计算调用的总数poll()在循环中:

AtomicInteger total = new AtomicInteger();
ConcurrentLinkedQueue<Integer> q = new ConcurrentLinkedQueue<>();
Thread thread = new Thread(() -> {
    int remaining = 10000;
    while (remaining != 0) {
        total.incrementAndGet();
        if (q.poll() != null) {
            remaining--;
        }
    }
});
Integer[] first100 = new Integer[100];
for (int i = 0 ; i != 100 ; i++) {
    first100[i] = i;
}
long start = System.nanoTime();
thread.start();
for (int i = 0 ; i != 10000 ; i++) {
    q.add(first100[i%100]);
}
thread.join();
long runtime = System.nanoTime() - start;

这个想法是在没有其他处理的情况下测量队列的“吞吐量”。该任务在读取线程中进行了 60K 次迭代,并在 11.23 毫秒内完成(demo 1 https://ideone.com/nx4inY) with ConcurrentLinkedQueue,以及 23,46 ms / 100K 迭代LinkedBlockingQueue (demo 2 https://ideone.com/sYoUnO).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我们有 LinkedBlockingQueue 时,为什么还要使用 ConcurrentLinkedQueue? 的相关文章

随机推荐

  • 上传错误:无法连接到 DataPusher。 ckan 2.4.3 中的错误

    我正在尝试将我的数据集上传到数据存储区 我创建数据集并尝试使用 ckan 界面中的 上传到数据存储 菜单将数据集上传到数据存储 我收到 上传错误 无法连接到 DataPusher Web 中的错误消息不在任何日志中 ckan 日志 data
  • 如何使用 RemoteViews 更新通知?

    我正在创建一个通知RemoteViews https d android com reference android widget RemoteViews从一个习惯Service 它在前台模式下以通知方式运行 也就是说 只要通知对用户可见
  • 根据另一列的相应行值创建行子集?

    让 CSV 包含两列 年龄 和 性别 其中 Age 30 24 55 61 70 21 Gender Male Female Male Male Male Female 我希望它向我显示与 Gender Male 相对应的所有 Age 值
  • R 从一个向量的最大值中提取 data.frame 的子集并按另一个向量分组[重复]

    这个问题在这里已经有答案了 gt ID lt c A A A B B B C C C C C gt WK lt c 1 2 3 1 2 3 1 2 3 4 5 gt NumSuccess lt c 0 0 2 0 0 1 0 0 0 0 3
  • 导出数组以在另一个 javascript 文件中使用

    在我的帖子请求中 我想检查是否thisString存在于另一个 javascript 文件数组中 Array js exports names John Mary Main js if names includes thisString d
  • jQuery UI 对话框关闭并没有清除对话框

    Using jQuery用户界面 http en wikipedia org wiki JQuery UI 我有一个选项卡插件 在选项卡 1 中加载了一个包含表格的页面 每行都有一个对话框的链接 一切正常 保存以下内容 对话框中有一个选项可
  • 在 Win32 程序中用 main() 函数替换 WinMain()

    我在 StackOverflow 和 Google 上进行了一些搜索 但没有找到答案 我想用这种类型的用户编程来启动我的应用程序 int main Window App Test 640 480 while App IsOpen Do th
  • JavaScript 变量作用域 [重复]

    这个问题在这里已经有答案了 我的一些 JavaScript 代码有问题 Script setTimeout function for var i 0 i lt 5 i setTimeout function console log i i
  • Swift 和变异结构

    当谈到 Swift 中的值类型变化时 我并不完全理解 正如 Swift 编程语言 iBook 中所述 默认情况下 无法从其实例方法中修改值类型的属性 为了使这成为可能 我们可以用mutating结构体和枚举中的关键字 我不完全清楚的是 您可
  • 如何使用 C# 以编程方式复制 MS SQL 2000 数据库?

    我需要使用 C VS 2005 将多个表从一个数据库复制到 SQL Server 2000 中的另一个数据库 该调用需要参数化 我需要能够传入我要将这些表复制到的数据库的名称 我可以使用带参数的 DTS 但我找不到任何从 C 执行此操作的示
  • 以 EXCEL 格式导出 HP Fortify SCA 4.10 结果

    我使用 HP Fortify SCA 4 10 进行扫描 现在我想将原始结果导出为 Excel 格式以进行数据处理以生成数据透视表 任何人都可以建议一个简单或困难的方法来做到这一点 引用此 url 获取 DB 脚本以获取 EXCEL 格式
  • 与小写变量名称匹配的 Scala 模式

    我发现当使用模式匹配与替代项 对于字符串 时 Scala 接受以大写字母开头的变量 在下面的示例中 MyValue1 and MyValue2 但不是以小写字母 myValue1 myValue2 这是 Scala 的错误还是功能 我在 2
  • 避免嵌入式目标上的虚拟函数

    我有一个class Player从由许多相等的块组成的大内存块中回放数据 typedef char chunk t 100 typedef struct chunk t data 100 blockOfMemory t 理论上 播放器本身可
  • 如何在不使用Tensorboard的情况下在Tensorflow中绘制损失曲线?

    嘿 我是 Tensorflow 新手 我使用 DNN 来训练模型 我想绘制损失曲线 但是 我不想使用 Tensorboard 因为我对此并不熟悉 我想知道是否可以提取每个步骤中的损失信息并使用其他绘图包或 scikit learn 绘制它
  • 没有重复子项的树

    Using anytree https pypi python org pypi anytree我制作了这样的树 A B C D F B C E G 有没有办法删除所有重复的子级并将其变成下面的树 对所有可能级别的子级进行递归 A B C
  • Android:如何重置发布版本的 resConfigs?

    为了让开发更快 我想做以下事情 android defaultConfig resConfigs en 我的应用程序有多种语言 这样做可以在开发时节省大量时间 但是 我不想发布包含此集的版本 很遗憾 resConfigs不适用于产品口味或构
  • 如何使用管道分隔符导出到 .csv

    我使用 Google Sheets 电子表格 来合并我的 Gambio 商店的不同来源的文章数据 要导入数据 我需要在 csv 文件中使用管道符号作为分隔符 分隔符 并使用 作为文本分隔符 在用于导出到 csv 的 Google 表格菜单中
  • 我可以在 POSTMAN 中发送二维数组作为参数吗?

    我需要在 POSTMAN 中将参数作为对象数组发送 array field1 html field2 5 field1 css field2 3 我知道数组必须发送为array 但如何将数组中的一项设置为对象呢 我试过这个 array fi
  • 一次播放多个声音?

    我在一个视图上有 6 个声音 然而我想要它 这样我就可以一次播放多个声音 所以你点击声音 1 声音 1 正在播放 然后声音 2 播放 当声音 1 仍在播放时 但此时我按声音1 声音1播放 按声音2 声音2播放 但声音1停止 这是音频部分的代
  • 当我们有 LinkedBlockingQueue 时,为什么还要使用 ConcurrentLinkedQueue?

    我为什么要使用ConcurrentLinkedQueue当我有LinkedBlockingQueue 我知道ConcurrentLinkedQueue是非阻塞的但是LinkedBlockingQueue可以作为ConcurrentLinke