如果没有
volatile代码,则无法在多个线程中正常工作。
从Wikipedia的双重检查锁定:
从J2SE
5.0开始,此问题已得到解决。现在,volatile关键字可确保多个线程正确处理单例实例。在“双重检查锁定已损坏”声明中描述了这一新用法:
// Works with acquire/release semantics for volatile// Broken under Java 1.4 and earlier semantics for volatileclass Foo { private volatile Helper helper = null; public Helper getHelper() { Helper result = helper; if (result == null) { synchronized(this) { result = helper; if (result == null) { helper = result = new Helper(); } } } return result; } // other functions and members...}通常,如果可能,应该避免仔细检查锁定,因为很难正确,如果错误,则很难找到错误。请尝试使用以下更简单的方法:
如果helper对象是静态的(每个类加载器一个),则替代方法是按需初始化持有人惯用语
// Correct lazy initialization in Java @ThreadSafeclass Foo { private static class HelperHolder { public static Helper helper = new Helper(); } public static Helper getHelper() { return HelperHolder.helper; }}


