zoukankan      html  css  js  c++  java
  • 多线程下单例模式示例(synchronized,DCL,volatile)

    //加锁、保证线程安全的单例模式(重量级)

    class
    SingleDemo { public static SingleDemo instance = null; private SingleDemo() { System.out.println(Thread.currentThread().getName() + " 我是SingleDemo构造方法"); } public static synchronized SingleDemo getInstance() { if (instance == null) { instance = new SingleDemo(); } return instance; } }
    //DCL(双端检索)机制不一定线程安全,原因是有指令重排,加入volatile可以禁止指令重排
    //指令重排可能导致线程不安全

    public
    static SingleDemo getInstance() { if (instance == null) { //DCL(双端检索)机制 synchronized (SingleDemo.class) { if (instance == null) { instance = new SingleDemo(); } } } return instance; }
    //DCL(Double check lock) + volatile 单例模式 (轻量级)

    class
    SingleDemo { public static volatile SingleDemo instance = null; private SingleDemo() { System.out.println(Thread.currentThread().getName() + " 我是SingleDemo构造方法"); } public static SingleDemo getInstance() { if (instance == null) { //DCL(双端检索)机制 synchronized (SingleDemo.class) { if (instance == null) { instance = new SingleDemo(); } } } return instance; } }

    public class Main {
    
        public static void main(String[] args) {
            for (int i = 0; i < 5; i++) {
                new Thread(() -> {
                    SingleDemo.getInstance();
                }, String.valueOf(i)).start();
            }
        }
    }

     

  • 相关阅读:
    Linux GCC常用命令
    用两个栈实现一个队列(转载)
    BMP格式介绍(一)
    图像处理笔记(1): bmp文件结构处理与显示
    大数据竞赛平台——Kaggle 入门篇
    图像识别中的深度学习
    面向对象中的抽象和具体类的理解
    全排列算法
    少有程序员读的书
    照片回执
  • 原文地址:https://www.cnblogs.com/mawenzhu/p/13229593.html
Copyright © 2011-2022 走看看