pratnala
pratnala

Reputation: 3843

Thread safe implementation for Hash Map

First, I'll describe what I want and then I'll elaborate on the possibilities I am considering. I don't know which is the best so I want some help.

I have a hash map on which I do read and write operations from a Servlet. Now, since this Servlet is on Tomcat, I need the hash map to be thread safe. Basically, when it is being written to, nothing else should write to it and nothing should be able to read it as well.

I have seen ConcurrentHashMap but noticed its get method is not thread-safe. Then, I have seen locks and something called synchronized.

I want to know which is the most reliable way to do it.

Upvotes: 5

Views: 20344

Answers (5)

Peter Lawrey
Peter Lawrey

Reputation: 533660

ConcurrentHashMap.get() is thread safe.

You can make HashMap thread safe by wrapping it with Collections.synchronizedMap().

Upvotes: 19

alexca
alexca

Reputation: 57

This is the point of ConcurrentHashMap class. It protects your collection, when you have more than 1 thread.

Upvotes: 0

Jigar Joshi
Jigar Joshi

Reputation: 240928

Collections.synchronizedMap(new HashMap<K, V>);

Returns a synchronized (thread-safe) map backed by the specified map. In order to guarantee serial access, it is critical that all access to the backing map is accomplished through the returned map.

It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views:

Upvotes: 3

Deactivator2
Deactivator2

Reputation: 311

EDIT: removed false information

In any case, the synchronized keyword is a safe bet. It blocks any threads from accessing the object while inside a synchronized block.

// Anything can modify map at this point, making it not thread safe
map.get(0);

as opposed to

// Nothing can modify map until the synchronized block is complete
synchronized(map) {
    map.get(0);
}

Upvotes: 4

saurav
saurav

Reputation: 3462

I would like to suggest you to go with ConcurrentHashMap , the requirement that you have mentioned above ,earlier I also had the same type of requirement for our application but we were little more focused on the performance side.

I ran both ConcurrentHashMap and map returned by Colecctions.synchronizedMap(); , under various types of load and launching multiple threads at a time using JMeter and I monitored them using JProfiler .After all these tests we came to conclusion that that map returned by Colecctions.synchronizedMap() was not as efficient in terms of performance in comaprison to ConcurrentHashMap.

I have written a post also on the same about my experience with both.

Thanks

Upvotes: 3

Related Questions