如何以原子方式在作为ConcurrentMap映射一部分的ConcurrentLinkedQueue中添加延迟?

约翰

我正在计算应用程序中的延迟(以毫秒为单位),我想将这些指标插入线程安全列表结构中。然后,我将使用该列表来计算平均值,中位数,第95个百分位数。所以我了一下,发现列表没有太多选择,所以我决定使用它ConcurrentLinkedQueue来存储线程安全的延迟。如果我应该为此使用其他更好的线程安全数据结构,请告诉我。

public class LatencyMetricHolder {
  private final ConcurrentLinkedQueue<Long> latenciesHolder = new ConcurrentLinkedQueue<>();

  private static class Holder {
    private static final LatencyMetricHolder INSTANCE = new LatencyMetricHolder();
  }

  public static LatencyMetricHolder getInstance() {
    return Holder.INSTANCE;
  }

  private LatencyMetricHolder() {}    

  public void addLatencies(long latency) {
    latenciesHolder.add(latency);
  }

  public ConcurrentLinkedQueue<Long> getLatenciesHolder() {
    return latenciesHolder;
  }
}

我正在调用addLatencies方法来填充多线程代码中的延迟。

现在,我想latenciesHolder每个processId都有一个String。这意味着我们也可以processId多次获得相同的消息,有时它是一个新消息processId,因此我需要以某种方式以线程安全的方式和原子的方式为此提取latenciesHolder队列processId并在该特定队列上添加延迟。

因此,我决定为此使用并发映射,如下所示,其中的key将是processId

private final Map<String, ConcurrentLinkedQueue<Long>> latenciesHolderByProcessId = Maps.newConcurrentMap();

由于我使用的是地图,因此我需要同步创建新ConcurrentLinkedQueue实例,这在Java 7中有点棘手,我想就像在Java 7上一样。

什么是从多个线程中以原子方式无争用地填充此映射的正确方法,并且我想使用并发集合而不是常规锁定(如果有的话)?

更新:

  public void add(String type, long latencyInMs) {
    ConcurrentLinkedQueue<Long> latencyHolder = latenciesHolderByProcessId.get(type);
    if (latencyHolder == null) {
      latencyHolder = Queues.newConcurrentLinkedQueue();
      ConcurrentLinkedQueue<Long> currentLatencyHolder =
          latenciesHolderByProcessId.putIfAbsent(type, latencyHolder);
      if (currentLatencyHolder != null) {
        latencyHolder = currentLatencyHolder;
      }
    }
    latencyHolder.add(latencyInMs);
  }
罗伯托·阿蒂亚斯(Roberto Attias)

好的,我不确定我是否所有规格都正确,但这是一种实现方法:

public class LatencyMetricHolder {

 HashMap<Integer, ConcurrentLinkedQueue<Long>> map = new HashMap<>();

 public void addLatency(int processID, long latency) {
    synchronized(map) {
      ConcurrentLinkedQueue<Long> q = map.get(processID);
      if (q == null) {
        q = new ConcurrentLinkedQueue<Long>()
        map.put(processID, q);
      }
    }
    q.add(latency)
  }

  public ConcurrentLinkedQueue<Long> getLatenciesHolder(int processID) {
    synchronized(map) {
      return map.get(processId);
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以编程方式在Android中编写粗体字符串的一部分?

来自分类Dev

如何通过PHP在JSON添加@符号作为对象名的一部分

来自分类Dev

Firebase Realtime DB:作为原子更新的一部分删除节点

来自分类Dev

如何用熊猫中的字典映射列值的一部分?

来自分类Dev

如何在Eclipse中实现Master Detail Form作为MultiPageEditor的一部分?

来自分类Dev

如何在Flask中返回图像作为GET请求响应的一部分?

来自分类Dev

如何在 mysql 中执行 IF 语句作为 SELECT 语句的一部分

来自分类Dev

是否可以延迟对作为函数调用一部分的表达式的求值?

来自分类Dev

如何在React中为正文文本的一部分添加样式

来自分类Dev

将事件侦听器作为部分页面的一部分加载时,如何将其添加到表单中?

来自分类Dev

添加额外的数据作为url的一部分,而不作为参数

来自分类Dev

如何以降低的特权运行脚本的一部分?

来自分类Dev

带下划线的数字文字如何在Java中工作以及为什么将其作为jdk 1.7的一部分添加

来自分类Dev

如何在Paw中将文件作为多部分请求的一部分上载?

来自分类Dev

添加自定义操作作为操作下拉列表 (AEF) 的一部分

来自分类Dev

作为结构调用的一部分,如何在一行中编写变量名称?

来自分类Dev

如何使Automapper映射另一个表的一部分的属性

来自分类Dev

作为表格一部分的单选按钮

来自分类Dev

UiSegmentedControl作为UILabel子类的一部分

来自分类Dev

将标题作为CURL的一部分

来自分类Dev

块作为块的一部分

来自分类Dev

Promise 作为 redux 状态的一部分

来自分类Dev

在Ansible中,我如何接受WebSphere MQ许可协议作为剧本的一部分?

来自分类Dev

您如何在Visual Studio Team Services中检入文件作为构建的一部分?

来自分类Dev

如何在Python3中作为类的一部分正确调用__setattr __()?

来自分类Dev

如何在Docker容器中执行命令作为Bash Shell脚本的一部分

来自分类Dev

如何在angularJs 1.5中将$ scope变量作为组件的templateUrl的一部分传递?

来自分类Dev

如何使用Firebase UID作为图像URL的一部分从Firebase存储中检索图像?

来自分类Dev

在Shell中,如何对作为字符串一部分的数字进行算术运算?

Related 相关文章

  1. 1

    如何以编程方式在Android中编写粗体字符串的一部分?

  2. 2

    如何通过PHP在JSON添加@符号作为对象名的一部分

  3. 3

    Firebase Realtime DB:作为原子更新的一部分删除节点

  4. 4

    如何用熊猫中的字典映射列值的一部分?

  5. 5

    如何在Eclipse中实现Master Detail Form作为MultiPageEditor的一部分?

  6. 6

    如何在Flask中返回图像作为GET请求响应的一部分?

  7. 7

    如何在 mysql 中执行 IF 语句作为 SELECT 语句的一部分

  8. 8

    是否可以延迟对作为函数调用一部分的表达式的求值?

  9. 9

    如何在React中为正文文本的一部分添加样式

  10. 10

    将事件侦听器作为部分页面的一部分加载时,如何将其添加到表单中?

  11. 11

    添加额外的数据作为url的一部分,而不作为参数

  12. 12

    如何以降低的特权运行脚本的一部分?

  13. 13

    带下划线的数字文字如何在Java中工作以及为什么将其作为jdk 1.7的一部分添加

  14. 14

    如何在Paw中将文件作为多部分请求的一部分上载?

  15. 15

    添加自定义操作作为操作下拉列表 (AEF) 的一部分

  16. 16

    作为结构调用的一部分,如何在一行中编写变量名称?

  17. 17

    如何使Automapper映射另一个表的一部分的属性

  18. 18

    作为表格一部分的单选按钮

  19. 19

    UiSegmentedControl作为UILabel子类的一部分

  20. 20

    将标题作为CURL的一部分

  21. 21

    块作为块的一部分

  22. 22

    Promise 作为 redux 状态的一部分

  23. 23

    在Ansible中,我如何接受WebSphere MQ许可协议作为剧本的一部分?

  24. 24

    您如何在Visual Studio Team Services中检入文件作为构建的一部分?

  25. 25

    如何在Python3中作为类的一部分正确调用__setattr __()?

  26. 26

    如何在Docker容器中执行命令作为Bash Shell脚本的一部分

  27. 27

    如何在angularJs 1.5中将$ scope变量作为组件的templateUrl的一部分传递?

  28. 28

    如何使用Firebase UID作为图像URL的一部分从Firebase存储中检索图像?

  29. 29

    在Shell中,如何对作为字符串一部分的数字进行算术运算?

热门标签

归档