当前位置: 首页 > 知识库问答 >
问题:

更高效的多线程可能吗?

公西嘉玉
2023-03-14

我有一个并发哈希映射,我需要在其中更新循环中的值。虽然,并发映射本身是线程安全的,但添加操作不是原子的,因此我需要添加同步块。如果我在这里错了,请纠正我。

问题是是否可以使用锁等更有效地同步此代码?我正在从阻塞队列中获取值。

这是代码:

// running in a loop

String i =  (String) queue.take();

synchronized(this) {
    if(hashmap.containsKey(i)) {

        hashmap.put(i, hashmap.get(i) + 1);

    } else {    
        hashmap.put(i, 1);      
    }
}

共有1个答案

姜振濂
2023-03-14

您可以使用<code>ConcurrentHashMap。computeIfAbsent和AtomicInteger值来实现计数器映射,而不同步整个映射:

ConcurrentHashMap<String,AtomicInteger> map = new ConcurrentHashMap<>();

String key = ...
map.computeIfAbsent(key, k -> new AtomicInteger()).incrementAndGet();
 类似资料:
  • 线程的定义是程序的执行路径。每个线程都定义了一个独特的控制流,如果应用程序涉及到复杂且耗时的操作,那幺设置不同的线程执行路径会非常有好处,因为每个线程会被指定于执行特定的工作。 线程实际上是轻量级进程。一个常见的使用线程的实例是现代操作系统中的并行编程。使用线程不仅有效地减少了 CPU 周期的浪费,同时还提高了应用程序的运行效率。 到目前为止我们所编写的程序都是以一个单线程作为应用程序的运行的,其

  • 本文向大家介绍使用多线程可能带来的问题?相关面试题,主要包含被问及使用多线程可能带来的问题?时的应答技巧和注意事项,需要的朋友参考一下 并发编程的目的就是为了能提高程序的执行效率提高程序运行速度,但是并发编程并不总是能提高程序运行速度的,而且并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、死锁还有受限于硬件和软件的资源闲置问题。

  • 问题内容: 问候贵族社区, 我想要以下循环: 这将在使用线程的共享内存四核计算机上并行运行。对于这些线程要执行的代码,正在考虑以下两种选择,其中线程的ID是:0、1、2或3。 (为简单起见,假设为4的倍数) 选项1: 选项2: 我的问题是,是否有一种方法比另一种方法更有效,为什么? 问题答案: 第二个比第一个更好。简单的答案:第二个最小化错误共享 现代CPU不会将字节一一加载到缓存中。它在称为缓存

  • 我正在使用作为我的一个库中的。我不确定我是否在多线程环境中正确地使用它,因为我的库在多线程环境中会在非常大的负载下使用,所以它必须非常快。 下面是我的DataClient类: 这就是我要打电话获取数据的方式: 现在我的问题是--我不确定我是否正确地将与一起使用。这里是否需要以及? 我的主要目标是在多线程环境中高效地使用。因为我的库将在非常大的负荷下使用,所以它必须非常快。在重载下,我看到了大量的T

  • 问题内容: 我在某个字段上有一个带有getter 和setter 的类,例如field 说一个类的对象。 在这里synchronized– 不是。 我正在从多个线程中更新值。每个线程都在获取值,并进行适当设置。线程不会以任何方式共享任何其他资源。 在每个线程中执行的代码如下。 该方法只是对通过传递给它的参数从构造函数内部更新的成员调用上述方法: 当我按较大的顺序运行此线程时,线程之间的交错并不多-

  • 问题内容: 我正在编写Node插件,尝试从C ++工作线程调用V8函数对象时遇到问题。 我的插件基本上是启动一个C std :: thread并使用WaitForSingleOject()进入一个等待循环,这是由另一个C 应用程序(一个X- Plane插件)向共享内存中写入数据触发的。我试图让我的Node插件在发出Windows共享事件信号时唤醒,然后调用我从node应用程序注册的JavaScri