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()
或迭代而不删除)如果这些条件中的任何一个不正确,那么您将需要使用同步映射.
归档时间: |
|
查看次数: |
24462 次 |
最近记录: |