如果多个线程写入单个映射,则使用哪个映射实现
Which map implementation to use if multiple threads write to a single map
在我的应用程序中,我将使用地图。
- 多个线程将数据写入此地图。写操作太多了。
- 但是,在每次写入期间,馈送到地图的数据都有不同的键。
- 地图中的数据在应用程序的任何时候都不会被读取。
- 偶尔,内容会被转储到文件中。
我想了解以下内容:
- 这样的话,write方法是否需要同步?
- ConcurrentHashMap 适合我的需要吗?
- 如果不是,在此应用中使用什么是正确的 Map 实现
案例?
如果您确实需要 Map
,那么 ConcurrentHashMap
就是您所需要的。阅读更多相关信息 here。
关注这几点:
The data that is fed to the map has a different key during every write
The data in the map would not be read at any point in the application
您根本不需要 Map
。我假设当你声明地图中的数据不会被读取时,你的意思是你没有做 map.get(someKey)
而是你将遍历整个地图以将数据存储在文件中(或无论您使用何种数据源)。
这点:
- Once in a while the content would be dumped to a file
加强上述建议。
关注点:
- Multiple threads would be writing data to this map.The write operations are too many.
最好的建议是使用 BlockingQueue
. As implementation, you may use LinkedBlockingQueue
。
如果您使用 Java 同步从 Map
转储数据,并且 want/need 以 Map
的形式恢复此数据,则使用 ConcurrentHashMap
。如果这不是您的用例的一部分,因为您将通过其他方式从文件中读取数据,请避免使用 Map
并使用 BlockingQueue
.
正如你所说,ConcurrentHashMap 似乎符合你的要求。它是线程安全的,无需同步整个地图。读取可以非常快地进行,而写入是用锁完成的。
您的所有密钥都是唯一的,因此您不一定需要同步来确保地图的完整性,但在实际写入文件时确实需要同步。使用 ConccurentHashMap 或普通的同步映射都适合您。您可以不用 Map 也可以简单地将 key/value 存储在某个对象中并将该对象存储在同步列表中。
- 没有
- 是
然而我发现这是矛盾的:
- 地图中的数据在应用程序的任何时候都不会被读取
- 偶尔会将内容转储到文件中。
如何在不读取文件的情况下转储到文件?
我认为可以肯定地说 ConcurrentHashMap 无论如何都可以处理这种情况,所以去吧。
至1: Map
interface does not guarantee any synchronization, especially not on writes. Looking at the non-concurrent implementations (HashMap
, HashTable
, IdentityHashMap
, LinkedHashMap
, TreeMap
and WeakHashMap
), 都表示
if multiple threads access a map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.
致 2 和 3:如果您使用的是 ConcurrentHashMap
, you would not have to worry about synchronization. But I agree with : do not use a Map
。
在我的应用程序中,我将使用地图。
- 多个线程将数据写入此地图。写操作太多了。
- 但是,在每次写入期间,馈送到地图的数据都有不同的键。
- 地图中的数据在应用程序的任何时候都不会被读取。
- 偶尔,内容会被转储到文件中。
我想了解以下内容:
- 这样的话,write方法是否需要同步?
- ConcurrentHashMap 适合我的需要吗?
- 如果不是,在此应用中使用什么是正确的 Map 实现 案例?
如果您确实需要 Map
,那么 ConcurrentHashMap
就是您所需要的。阅读更多相关信息 here。
关注这几点:
The data that is fed to the map has a different key during every write
The data in the map would not be read at any point in the application
您根本不需要 Map
。我假设当你声明地图中的数据不会被读取时,你的意思是你没有做 map.get(someKey)
而是你将遍历整个地图以将数据存储在文件中(或无论您使用何种数据源)。
这点:
- Once in a while the content would be dumped to a file
加强上述建议。
关注点:
- Multiple threads would be writing data to this map.The write operations are too many.
最好的建议是使用 BlockingQueue
. As implementation, you may use LinkedBlockingQueue
。
如果您使用 Java 同步从 Map
转储数据,并且 want/need 以 Map
的形式恢复此数据,则使用 ConcurrentHashMap
。如果这不是您的用例的一部分,因为您将通过其他方式从文件中读取数据,请避免使用 Map
并使用 BlockingQueue
.
正如你所说,ConcurrentHashMap 似乎符合你的要求。它是线程安全的,无需同步整个地图。读取可以非常快地进行,而写入是用锁完成的。
您的所有密钥都是唯一的,因此您不一定需要同步来确保地图的完整性,但在实际写入文件时确实需要同步。使用 ConccurentHashMap 或普通的同步映射都适合您。您可以不用 Map 也可以简单地将 key/value 存储在某个对象中并将该对象存储在同步列表中。
- 没有
- 是
然而我发现这是矛盾的:
- 地图中的数据在应用程序的任何时候都不会被读取
- 偶尔会将内容转储到文件中。
如何在不读取文件的情况下转储到文件?
我认为可以肯定地说 ConcurrentHashMap 无论如何都可以处理这种情况,所以去吧。
至1: Map
interface does not guarantee any synchronization, especially not on writes. Looking at the non-concurrent implementations (HashMap
, HashTable
, IdentityHashMap
, LinkedHashMap
, TreeMap
and WeakHashMap
), 都表示
if multiple threads access a map concurrently, and at least one of the threads modifies the map structurally, it must be synchronized externally.
致 2 和 3:如果您使用的是 ConcurrentHashMap
, you would not have to worry about synchronization. But I agree with Map
。