• 关于双重检验锁方法和内部类方法实现单例模式的实验


    网上很多人说,使用双重检验锁方法实现单例模式可能会new多个实例,而内部类方法和枚举类方法完美解决了这个问题

    因为Android很少使用枚举,本次只研究双重检验锁方法和内部类方法

    双重检验锁方法:

    代码如下:

    public class SingletonB {
    	private static volatile SingletonB mInstance;
    
    	private SingletonB() {
    		System.out.println("双重检验锁方法单例模式");
    	}
    
    	public static SingletonB getInstance() {
    		if (mInstance == null) {
    			synchronized (SingletonB.class) {
    				if (mInstance == null) {
    					mInstance = new SingletonB();
    				}
    			}
    		}
    		return mInstance;
    	}
    }
    

    内部类方法:

    代码如下:

    public class SingletonA {
    	private SingletonA() {
    		System.out.println("内部类方法单例模式");
    	}
    
    	private static class Singleton {
    		private static final SingletonA INSTANCE = new SingletonA();
    	}
    
    	public static SingletonA getInstance() {
    		return Singleton.INSTANCE;
    	}
    }
    

    在多线程环境下分别使用这两种单例模式

    测试代码:

    public class Test {
    
    	public static void main(String[] args) {
    		Thread[] threads = new Thread[10000];
    		for (int i = 0; i < threads.length; i++) {
    			threads[i] = new Thread() {
    				public void run() {
    					SingletonA.getInstance();
    					SingletonB.getInstance();
    				};
    			};
    		}
    		for (int i = 0; i < threads.length; i++) {
    			threads[i].start();
    		}
    	}
    
    }
    

    运行结果

    运行了N次,两个单例模式都是只运行了一次构造函数。

    其实我的期望是能出现双重锁方法的bad case,但是并没有出现。本次实验失败,下次再接再厉。

  • 相关阅读:
    BUAA 2020 软件工程 个人项目作业
    BUAA 2020 软件工程 个人博客作业
    BUAA 2020 软件工程 热身作业
    面向对象设计与构造2019 第四单元总结博客作业
    面向对象设计与构造2019 第三单元总结博客作业
    Windows 安装rabbitmq
    windows 安装mongodb4.2.7
    docker安装(ubuntu20.04)
    C# 文件操作
    经纬度转换 sql 自定义函数
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/9114283.html
Copyright © 2020-2023  润新知