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

并发hashmap的同步块

汪文光
2023-03-14

当使用并发hashmap时,我是否需要将put环绕在一个同步块上,是否存在竞争条件:

    synchronized(lock) {
        if(this.map.get(id) != null) {
            throw new Exception();
        }
        this.map.put(id, number);
        return true;
    }

共有1个答案

太叔鹏云
2023-03-14

在使用ConcurrentHashMap时,不应该像上面的例子那样进行同步

通过在映射上进行同步,您将失去使用ConcurrentHashMap的好处,因为它不会为每次访问锁定整个表。

在你的情况下,你应该做的是使用原子操作putIfAbsent。

当以多线程方式使用时,您获得的是map的吞吐量。

 类似资料:
  • 假设,我有如下 concurrentHashMap 代码: 此 方法是从多个线程调用的,可以尝试同时更新同一 accountId 的数量。 如何确保currentBalance在< code>get和< code>put之间不发生变化?因为根据我的理解,如果线程在执行< code>get后抢占,同时其他线程更新余额,< code>put将使用旧余额执行更新。

  • 同步(Synchronization) 线程间的通信主要是通过共享访问字段以及其字段所引用的对象来实现的。这种形式的通信是非常有效的,但可能导致2种可能的错误:线程干扰(thread interference)和内存一致性错误(memory consistency errors)。同步就是要需要避免这些错误的工具。 但是,同步可以引入线程竞争(thread contention),当两个或多个线程

  • 我有一个并发HashMap,我在其中执行以下操作: 我的问题是——是否没有必要做额外的 检查synschronized块内部,以便其他线程不会初始化相同的hashmap值? 也许检查是必要的,但我做错了?我在做的事情似乎有点愚蠢,但我认为这是必要的。

  • 主要内容:实例下面是一个具有同步功能的多线程示例,这是和上篇文章同样的例子,它依次打印计数器值,每次运行它时,它产生相同的结果。 实例 每次运行此程序时都会产生相同的结果 -

  • 问题内容: 是用什么包装类之间的差异上,和? 它只是能够在迭代()的同时进行修改吗? 问题答案: 同步: 每种方法都使用对象级锁进行同步。因此,synchMap上的get和put方法获取一个锁。 锁定整个集合是性能开销。当一个线程保持该锁时,其他任何线程都不能使用该集合。 是在JDK 5中引入的。 在对象级别没有锁定,锁定的粒度要好得多。对于,锁定可以处于哈希图存储桶级别。 较低级别的锁定的结果是

  • 典型的UNIX系统都支持一个进程创建多个线程(thread)。在Linux进程基础中提到,Linux以进程为单位组织操作,Linux中的线程也都基于进程。尽管实现方式有异于其它的UNIX系统,但Linux的多线程在逻辑和使用上与真正的多线程并没有差别。 多线程 我们先来看一下什么是多线程。在Linux从程序到进程中,我们看到了一个程序在内存中的表示。这个程序的整个运行过程中,只有一个控制权的存在。