Friday, December 27, 2013

I have a Map which is to be modified by several threads concurrently.
There seem to be three different synchronized Map implementations in the Java API:
  • Hashtable
  • Collections.synchronizedMap(Map)
  • ConcurrentHashMap
From what I understand, Hashtable is an old implementation (extending the obsolete Dictionaryclass), which has been adapted later to fit the Map interface. While it is synchronized, it seems to have serious scalability issues and is discouraged for new projects.
But what about the other two? What are the differences between Maps returned byCollections.synchronizedMap(Map) and ConcurrentHashMaps? Which one fits which situation?
share|improve this question
3 
I would suggest to read this article as to how ConcurrentHashMap works and what guarantees it can give.codercorp.com/blog/java/… –  Smiles in a Jar Aug 16 '11 at 3:40
 
@SmilesinaJar : very userful article –  Krsna Chaitanya yesterday 
add comment

11 Answers

up vote102down voteaccepted
For your needs, use ConcurrentHashMap. It allows concurrent modification of the Map from several threads without the need to block them. Collections.synchronizedMap(map) creates a blocking Map which will degrade performance, albeit ensure consistency (if used properly).
Use the second option if you need to ensure data consistency, and each thread needs to have an up-to-date view of the map. Use the first if performance is critical, and each thread only inserts data to the map, with reads happening less frequently.
share|improve this answer
2 
Looking at the source code, the synchronized map is only an implementation with one mutex (blocking) while the ConcurrentHashMap is more complex to deal with concurrent access –  Vinze Feb 4 '09 at 9:36
29 
Please also note that the ConcurrentHashMap does not allow null keys or values. So they are NOT equal alternatives of a synchronized map. –  onejigtwojig Oct 20 '11 at 19:42 
7 
add comment
The "scalability issues" for Hashtable are present in exactly the same way inCollections.synchronizedMap(Map) - they use very simple synchronization, which means that only one thread can access the map at the same time.
This is not much of an issue when you have simple inserts and lookups (unless you do it extremely intensively), but becomes a big problem when you need to iterate over the entire Map, which can take a long time for a large Map - while one thread does that, all others have to wait if they want to insert or lookup anything.
The ConcurrentHashMap uses very sophisticated techniques to reduce the need for synchronization and allow parallel read access by multiple threads without synchronization and, more importantly, provides an Iterator that requires no synchronization and even allows the Map to be modified during interation (though it makes no guarantees whether or not elements that were inserted during iteration will be returned).
share|improve this answer
1 
Now that's what I wanted! :) The no-synchronized Iterator is just pure sweetness alone! Thansk for the info! :) (: –  Kounavi Jun 30 '11 at 20:28 
 
Great answer..but does it mean during retrieval thread will not get the latest updates since reader threads are not in sync. –  MrA May 13 at 11:54
 
@MrA: Are you asking about the ConcurrentHashMap? And what do you mean by "retrieval"? – Michael Borgwardt May 13 at 12:24
1 
@Michael Borgwardt for ConcurrentHashmap for eg. suppose there are multiple threads. some of them are updating the Map and some of them are getting data from that same map. SO in this scenario when threads are trying to read is it guaranteed that they will get the latest data that has been updated since reader threads does not have to hold locks. –  MrA May 13 at 23:12
add comment
╔═══════════════╦═══════════════════╦═══════════════════╦═════════════════════╗
   Property         HashMap           Hashtable        ConcurrentHashMap  
╠═══════════════╬═══════════════════╬═══════════════════╬═════════════════════╣ 
      Null          allowed          not allowed          not allowed     
  values/keys                                                             
╠═══════════════╬═══════════════════╬═══════════════════╬═════════════════════╣
Is thread-safe        no                 yes                   yes        
╠═══════════════╬═══════════════════╬═══════════════════╬═════════════════════╣
     Lock             not           locks the whole   locks the portion of 
  mechanism        applicable            map                   map         
╠═══════════════╬═══════════════════╩═══════════════════╬═════════════════════╣
   Iterator                   fail-fast                      fail-safe      
╚═══════════════╩═══════════════════════════════════════╩═════════════════════╝
share|improve this answer
add comment
ConcurrentHashMap is preferred when you can use it - though it requires at least Java 5.
It is designed to scale well when used by multiple threads. Performance may be marginally poorer when only a single thread accesses the Map at a time, but significantly better when multiple threads access the map concurrently.
I found a blog entry that reproduces a table from the excellent book Java Concurrency In Practice, which I thoroughly recommend.
Collections.synchronizedMap makes sense really only if you need to wrap up a map with some other characteristics, perhaps some sort of ordered map, like a TreeMap.
share|improve this answer

1 comment:

hhh said...

Put on misunderstand me, Peaceful home life deep-fried ovum, And as well as lean beef patties, But hash cleveland (Yeezy Boost 350 Cheap) brown colours, That has (New Yeezys 2020) a bad side behind many fruits, As well as destroyed, Beverages, Whole dairy, Also Trix, Yet I add have (Coach Outlet Clearance Sale) enough time to make not to mention take in too sector (Michael Kors Outlet Online) and also fuckin working day, Directly, Would you? I usually tell him that outlined on our site prepare breakfast time if some other individual grilled the software to provided if you ask me, Including, At dinning, In particular a make of catering termed as a joint. The (Coach Outlet Store Online) thing is there just amount of major (Ray Ban Outlet Store) in the morning outlets inside this your (Cheap Yeezy Shoes Sale) community, And the razors that are great, For example choose Sunnypoint, Premature child, And also over straight forward, Are generally while well demanding to seize (Jordan Shoes For Sale Online) the fast for the morning, Along with provide