zoukankan      html  css  js  c++  java
  • 关于双重检验锁方法和内部类方法实现单例模式的实验

    网上很多人说,使用双重检验锁方法实现单例模式可能会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,但是并没有出现。本次实验失败,下次再接再厉。

  • 相关阅读:
    Python内存管理机制
    哈希表(散列表)
    Python面向对象三大特性
    Python 面向对象继承
    Python面向对象 类的空间问题
    面向对象初识
    增量式爬虫
    分布式爬虫
    crawlscrapy框架
    HTML
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/9114283.html
Copyright © 2011-2022 走看看