Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hashmap concurrency issue

I have a Hashmap that, for speed reasons, I would like to not require locking on. Will updating it and accessing it at the same time cause any issues, assuming I don't mind stale data?

My accesses are gets, not iterating through it, and deletes are part of the updates.

like image 770
Nathaniel Flath Avatar asked Jun 16 '09 18:06

Nathaniel Flath


2 Answers

Yes, it will cause major problems. One example is what could happen when adding a value to the hash map: this can cause a rehash of the table, and if that occurs while another thread is iterating over a collision list (a hash table "bucket"), that thread could erroneously fail to find a key that exists in the map. HashMap is explicitly unsafe for concurrent use.

Use ConcurrentHashMap instead.

like image 106
erickson Avatar answered Oct 03 '22 22:10

erickson


The importance of synchronising or using ConcurrentHashMap can not be understated.

I was under the misguided impression up until a couple of years ago that I could get away with only synchronising the put and remove operations on a HashMap. This is of course very dangerous and actually results in an infinite loop in HashMap.get() on some (early 1.5 I think) jdk's.

What I did a couple of years ago (and really shouldn't be done):

public MyCache {     private Map<String,Object> map = new HashMap<String,Object>();      public synchronzied put(String key, Object value){         map.put(key,value);     }      public Object get(String key){         // can cause in an infinite loop in some JDKs!!         return map.get(key);     } } 

EDIT: thought I'd add an example of what not to do (see above)

like image 20
Gareth Davis Avatar answered Oct 03 '22 21:10

Gareth Davis