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优化

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

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    MySQL中MyISAM为什么比InnoDB查询快
    .Net Core导入千万级数据至Mysql
    细说MySql索引原理
    原生Swagger界面太low(推荐)
    开源分布式调度系统分享(ScheduleMaster)
    tfs agent cicd 自动编译 xcpoy失败
    .net 网站
    Android App Arch
    Android 多进程引发的一次crash
    Scrapy 抓取数据入门操作
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524876.html
Copyright © 2011-2022 走看看