I have a cache which I implemented using a simeple HashMap. like -
HashMap cache = new HashMap();
You should mark the cache as volatile.
While you note that other threads may continue using a stale cache for "a long time" you should note that, without a synchronization edge, they are likely to continue using the stale cache forever. That's probably not the desired behavior.
In order of preference (mostly due to readability):
AtomicReferencevolatileSee also this question.