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

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

    内容来自博客园,拒绝爬虫网站
  • 相关阅读:
    UIScrollerView遇到UINavigationController
    iOS 自动化打包
    最最基本的SQL常用命令
    导入样式表与外部样式表的区别
    jdk、jre、JVM的简单区别与联系
    JDBC驱动的四种类型
    将映射中的值进行排序并输出键
    Java优先级队列
    Java线程池
    Callable--创建有返回值的线程
  • 原文地址:https://www.cnblogs.com/Heliner/p/10524876.html
Copyright © 2011-2022 走看看