You can skip the synchronization for read access to this card, if you make sure that all the records happen - before everything reads. What this means is described in JLS 7, chapter 17.4.5 .
In practice, you need to make sure that the value is HashMapfilled before any other threads that access it are launched, and that after that its contents will not be changed.
The reason this solution will work is because the call Thread.start()provides synchronization and therefore ensures that all changes made before this call are visible to both old and new threads after this call. If you change the object after this call, this guarantee will be lost and synchronized access is required.