zoukankan      html  css  js  c++  java
  • DCL实现多线程安全的高性能懒汉模式

    DCL实现多线程安全的高性能懒汉模式

    1.单线程安全的懒汉模式实现

    源码:
    private static LazyLoad instance = null;
    
    public static LazyLoad getInstance() {
            if (instance == null)
                instance = new LazyLoad();
            return instance;
    }
    
    

    2.多线程下低性能的懒汉模式(使用synchronized修饰方法)

    private static LazyLoad instance = null;
    
    /*使用synchronized修饰的静态方法*/
    public static synchronized LazyLoad getInstance() {
            if (instance == null)
                instance = new LazyLoad();
            return instance;
        }
    

    为什么说这个方法是低性能的呢:

    1. synchronized同步的方法是静态的,会导致进入该方法是JVM会锁定LazyLoad这个类

    解决方法:从上面可以看出只有lazyLoad==null时才需要初始化lazyLoad,而对象存在时只需要返回即可,并且return lazyLoad这个方法一定是线程安全的

    3.基于DCL双锁机制的懒汉模式

    ​ 源码:

    public class LazyLoad{
    
    private static LazyLoad instance = null;
    
    /*私有化静态方法*/
    private LazyLoad(){
        super();
    }
    /*DCL双锁机制*/
    
    public static synchronized LazyLoad getInstance() {
    	/*对象为空,锁定当前对象*/
    	if (instance == null) {
    		synchronized (LazyLoad.class) {
    		/**/
    			if (instance == null) {
    				instance = new LazyLoad();
    			}
    		}
    	}
    	/*对象不为空时直接返回对象,不使用synchronized*/
    	return instance;
    }
    }
    

    到这里基本安全的DCL双锁机制实现高性能懒汉模式;在真实应对有JVM指令重排的多线程情况下;还需将instance使用volidate进行修饰;

    private static volatile LazyLoad instance = null;

    关于更多指令重排和JVM下volatile的使用请参考

    Java 懒汉模式之Volatile优化

    好了,关于锁和懒汉模式就到这里了 ;

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    eclipse报错:发现了以元素 'd:skin' 开头的无效内容。此处不应含有子元素
    深入解析_Android的自定义布局
    RSA算法加密解密
    android版本
    TabHost+RadioGroup搭建基础布局
    android横竖屏控制
    一大波静态方法
    有时候
    简单的dialog菜单
    mongodb学习(三)——函数使用的小技巧
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524876.html
Copyright © 2011-2022 走看看