"There can never be two Currency instances that both represent the US$."
It should be noted that serialization/deserialization can create duplicate Currency instances representing the same currency, unless the class implements an appropriate writeReplace() method (returning an object implementing an appropriate readResolve()).
In general, great care has to be taken to make this "only one instance" work. Unless there's a very good reason to have this guarantee, it's usually simpler and more robust to just allow for multiple instances.
The sample code provided here is dangerous in that people are likely copy it without understanding these issues in detail and not fill out the blanks correctly.