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.
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With