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

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

posted @ 2019-03-13 18:03  随风而行-  阅读(640)  评论(0编辑  收藏  举报