Java 双检锁单例不加 volatile 为什么可能拿到半初始化对象? - 奇技淫巧 - 墨渊书肆