使数据结构成为线程安全的最有效方法(Java)

时间:2012-02-19 04:15:23

标签: java multithreading concurrency synchronized

我有一个需要线程安全的共享Map数据结构。是同步最有效的方式来读取或添加到地图吗?

谢谢!

编辑:数据结构是不可更新的缓存,即一旦填满,它就不会更新缓存。所以很多写入最初都有一些读取,然后它主要是读取

4 个答案:

答案 0 :(得分:6)

“效率最高”当然是相对的,取决于您的具体情况。但是如果你希望有许多线程同时处理地图,可以考虑ConcurrentHashMap之类的东西;它是线程安全的,但仍允许并发访问,与HashtableCollections.synchronizedMap()不同。

答案 1 :(得分:3)

这取决于您在应用中如何使用它。

如果你正在对其进行大量的读写操作,ConcurrentHashMap可能是最好的选择,如果它主要是读取,则使用ReadWriteLock将一个公共Map包装在一个集合中  (因为写入不常见,只有在写入时才能获得更快的访问和锁定。)

Collections.synchronizedMap()可能是最糟糕的情况,因为它可能只是给你一个包含所有方法同步的包装器,不惜一切代价避免它。

答案 2 :(得分:1)

对于您的特定用例(不可更新缓存),写入映射上的副本将优于同步映射和ConcurrentHashMap。

请参阅:https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap作为一个示例(我相信apache也有写地图实现的副本)。

答案 3 :(得分:0)

同步方法或集合肯定会起作用。它不是最有效的方法,但实现起来很简单,除非你每秒访问数百万次,否则你不会注意到开销。

更好的想法可能是使用ConcurrentHashMap - 这是从一开始就设计用于并发性的,并且应该在高度并发的情况下表现更好。