当前位置: 首页 > 面试题库 >

哈希图卡在获取

倪炎彬
2023-03-14
问题内容

我对HashMap有一个奇怪的问题。
有多个线程访问同一哈希图(不是线程安全的)。

有时,过程陷入困境。

当我检查线程堆栈时,我看到许多线程处于状态:

java.lang.Thread.State: RUNNABLE
    at java.util.HashMap.get(HashMap.java:303)

请注意,这种情况很少发生。并且不能按需复制。

为什么会卡住?

哈希图上没有同步。

键是字符串


问题答案:

有多个线程访问同一哈希图(不是线程安全的)。

听起来好像您HashMap没有
适当同步的线程环境中使用它。您遇到的问题是HashMap内存已损坏,因此线程很可能正在旋转。您无法更新未同步的映射并使用多个线程从中读取。在某些情况下,您可以构建一个只读映射,然后在不同步的情况下在多个线程中共享它。

我建议切换到使用ConcurrentHashMap替代或包装你HashMapCollections.synchronizedMap(...)

详细地说,这里的问题有两个方面。更改内部映射数据时,由于竞争条件,您不能有两个线程更新一个不同步的映射。必须进行锁定以确保互斥和正确的数据同步。一个线程可能会进行其他线程看不到的更改,而这些更改可能会覆盖它们。

另一个问题是内存同步。如果一个线程HashMap在其内存中更新,则其他线程不一定会获得相同的地图存储视图。在线程进行 部分 内存更新之前这不是问题-
在此部分HashMap内存已更新,而其他部分则没有。例如,您可能会获得存储区数组的一部分或存储区存储的一部分,这些存储区在遍历时会导致线程旋转。

多处理器盒运行线程代码更快的主要原因之一是线程可以使用按处理器 缓存的
内存。缓存的内存是问题所在。一个处理器可能正在另一处理器执行相同操作的同时读取或更改其缓存的内存。将本地缓存的内存与中央存储同步是您需要担心的事情之一,也是同步如此重要的原因。

如果 您使用的HashMap是仅由线程读取且从未更新过的预填充方法,则 可能没问题
。我高度依赖每个线程如何获得对new的引用HashMap。如果HashMap构造了,然后通过它们的构造函数(或在它们启动之前)将其填充并传递到线程中,那么您就很好了。但是,如果线程已经在运行,则取决于它们如何获得对映射的引用。根据情况和您的内存架构,他们可能仍会获得部分地图内存。



 类似资料:
  • 问题内容: 我想在Python中实现HashMap。我想请用户输入。根据他的输入,我正在从HashMap中检索一些信息。如果用户输入HashMap的键,我想检索相应的值。 如何在Python中实现此功能? 问题答案: Python字典是一种内置的类型,支持键值对。 以及使用dict关键字: 要么:

  • 我在Spring和Redis上都很新。我想知道有没有办法按价值得到钥匙? 例如,我希望获得具有给定文件哈希和内容的图像类型文件的get the KEY。我是这样做的: 然而,我被告知这是相当昂贵的,因为我要获得所有以“image”开头的键,并手动检查所有这些键。 现在我在想,也许如果我能按价值得到钥匙会好得多。以便更容易得到它的所有属性。在Redis可能吗?

  • hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field

  • 我知道可以访问docker api,下面的命令运行得很好: 然而,我真的希望避免暴露与容器本身绑定,因为它是CI构建的一部分。是否有其他方法可以从容器本身中检索容器图像id/哈希(即),而不暴露并向它发出请求? 也许就像这里显示的Docker一样,如何从容器中获取容器信息?

  • 哈希是键/值对 如果你想按名字查询,那么需要哈希。哈希的键必须唯一,但值可以是任意标量。 有时候你仍然会看到人们称它为“关联数组”,但不要想当然的把它作为数组。 通过键/值对列表来创建哈希 使用键/值对列表创建哈希: my %stooges = ( 'Moe', 'Howard', 'Larry', 'Fine', 'Curly', 'Howard', 'Iggy'

  • 问题内容: 我正在编写一个将HashMap返回给用户的应用程序。用户将获得对此MAP的引用。在后端,我将运行一些线程来更新Map。 到目前为止我做了什么? 我已经使所有后端线程都共享一个公用通道来更新MAP。因此,在后端,我确信并发写入操作不会成为问题。 我遇到的问题 如果用户尝试更新MAP并同时在后端更新MAP->并发写入操作问题。 如果使用尝试从MAP读取某些内容,同时MAP正在后端更新->并