一个问题:双重检查加锁为什么用了 volatile 就可以正确工作?
反过来问:不用 volatile 修饰 resource 属性有什么问题?
双重检查加锁的简单示例:
public class DoubleCheckedLocking {
    private static Resource resource;
    public static Resource getInstance() {
        if (resource == null) {     // LL01
            synchronized (DoubleCheckedLocking.class) {
                if (resource == null) {
                    resource = new Resource();
                }
            }
        }
        return resource;
    }
}