在多线程环境中使用HashMap

Paw*_*wan 7 java multithreading

我正在阅读关于JavaRevisited的面试问题,我很难理解这个问题:

在多线程环境中使用HashMap有什么问题?当get()方法进入无限循环时?

在我看来,HashMap在多线程环境中使用并不是问题,只要我们的应用程序不访问/读取正在修改创建的线程HashMap,而不是简单地访问HashMap.

所以,正如我所看到的,只要在应用程序中我们只是HashMap在多线程环境中访问它就没有问题.

如果我的理解是正确的,请告诉我.

Gra*_*ray 21

在多线程环境中使用HashMap有什么问题?当get()方法进入无限循环?

有什么不对的是让多个线程以不受保护的方式使用非同步集合(实际上是任何可变类).确定如果每个线程都有自己的HashMap 实例,那么这不是问题.这一个问题,如果多个线程要添加到同一 HashMap没有它的实例synchronized.即使只有一个线程正在修改a HashMap而其他线程正在从同一个映射中读取而没有同步,您将遇到问题.

如果您需要使用相同的哈希表对象在多线程,那么你应该考虑使用ConcurrentHashMap,每个包裹的访问到的HashMap一个synchronized {}块,或者利用了的Collections.synchronizedMap(new HashMap<...>())结构.

get()进入一个无限循环,因为一个线程只有一个部分更新的观点HashMap在内存中,必须有某种指针循环.这是使用具有多个线程的非同步集合的危险.

所以在我的理解中,只要在应用程序中我们只是在多线程环境中访问HashMap,它就不是问题了?

如果通过"访问"你的意思是"阅读",那么这对于资格来说就是如此.你必须确保:

  • 在线程实例化之前HashMap完成对它的所有更新,并且创建映射的线程也会分叉线程
  • 线程仅使用HashMap只读模式(get()或迭代而不删除)
  • 没有线程更新地图

如果这些条件中的任何一个不正确,那么您将需要使用同步映射.