Synchronization has gotten much cheaper over the years. Frankly I think that article in 2003 was already rather out-of-date in this area, and now it's more out-of date. Synchronization is
not that big a deal, performance-wise, and much convoluted, hard-to-maintain code has been written needlessly by people trying to avoid it.
As for your original question, Java 5
does allow the double-checked locking technique to work correctly,
if you mark the variable as volatile. If you don't mark the variable volatile, it's still broken. See
this FAQ for more info. And note that they suggest a better way to achieve a lazily-initialized singleton anyway: