In modern Java, it's easy enough if you've been shown the pattern. What's hard is understanding/discovering it from first principles.
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLo.... Scroll down to "Fixing Double-Checked Locking using Volatile." It's five lines of code without braces, and can be applied without any creativity or reasoning.
I tend to think Singletons are a dubious design pattern, like a lot of other people.