the reference to sharedData
which is final is thread safe since it can never be changed. The contents of the Map is NOT thread safe because it needs to be either wrapped with preferably a Guava ImmutableMap
implementation or java.util.Collections.unmodifiableMap()
or use one of the Map implementations in the java.util.concurrent
package.
Only if you do BOTH will you have comprehensive thread safety on the Map. Any contained Maps need to be immutable or one of the concurrent implementations as well.
.clone() is fundamentally broken, stay away
cloning by default is a shallow clone, it will just return references to container objects not complete copies. It is well documented in generally available information on why.