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 case in an infinite loop!!
return map.get(key);
}
}
EDIT: thought I'd add a what not todo code snippet