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

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

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    [数据结构]直接插入排序
    隐藏小程序scroll-view组件的滚动条
    当 uni-app 遇见 vscode
    npm(你怕吗) 全局安装与本地安装、开发依赖和生产依赖
    Vue-resource的使用
    spy-debugger调试、抓包工具
    一个小时学会Git
    flex布局踩过的坑
    Html5移动端布局及(rem布局)页面自适应布局详解
    使用vscode自动编译less
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524876.html
Copyright © 2011-2022 走看看