推荐两篇文章
https://blog.youkuaiyun.com/dl88250/article/details/5439024
http://www.infoq.com/cn/articles/double-checked-locking-with-delay-initialization
讲的非常好,解释了为啥需要在 Double Check 中用到 volatile 关键字。
结论
双重检查模式对于除了 long 和 double 的基本类型是适用的。
对于引用类型,则需要定义成volatile变量才不会出现问题。(得是在遵循 JSR133 规范的 Java 中)