1 Star 2 Fork 0

Eden/Notes

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Java 单例模式实现(懒加载+线程安全).md 1.87 KB
一键复制 编辑 原始数据 按行查看 历史

Java 单例模式实现(懒加载+线程安全)

双检锁

public class DoubleCheckLockingSingletonDemo {

    private DoubleCheckLockingSingletonDemo() {
    }

    private static volatile DoubleCheckLockingSingletonDemo instance;

    public static DoubleCheckLockingSingletonDemo getInstance() {
        if (null == instance) {
            synchronized (DoubleCheckLockingSingletonDemo.class) {
                if (null == instance) {
                    instance = new DoubleCheckLockingSingletonDemo();
                }
            }
        }
        return instance;
    }

}

枚举

public enum EnumSingletonDemo {

    INSTANCE;

    EnumSingletonDemo() {
    }

    public void whateverMethod() {
    }
}

静态内部类

public class InternalStaticClassSingletonDemo {

    private InternalStaticClassSingletonDemo() {
    }

    static class InternalStaticClass {
        public static volatile InternalStaticClassSingletonDemo instance = new InternalStaticClassSingletonDemo();
    }

    public static InternalStaticClassSingletonDemo getInstance() {
        return InternalStaticClass.instance;
    }

}

同步方法

public class SynchronizedFuncSingletonDemo {

    private SynchronizedFuncSingletonDemo() {
    }

    private static SynchronizedFuncSingletonDemo instance;

    public synchronized SynchronizedFuncSingletonDemo getInstance1() {
        if (null == instance) {
            instance = new SynchronizedFuncSingletonDemo();
        }
        return instance;
    }

}

问题

  • 为什么需要 volatile ?
    • volatile可以禁止指令重排序
  • 为什么需要禁止指令重排序?
    • 因为new并不是一个原子操作, new可以简单分成三个操作:
      • 分配一块内存
      • 将内存的地址赋值给变脸
      • 在内存上初始化对象
    • 所以不加volatile可能会抛出空指针
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/eden2f/notes.git
git@gitee.com:eden2f/notes.git
eden2f
notes
Notes
master

搜索帮助

Cb406eda 1850385 E526c682 1850385