Why are you adding the overhead of a synchornized operation on every execution, instead of replacing the original with a copy at the end of a copy operation?

Note that this class has a kind of threadsafe semantic, but it will not be thread safe if the underlying map isn't