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

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

DCL实现多线程安全的高性能懒汉模式的更多相关文章

  1. java 开发中经常问到得懒汉模式 (单利模式)

    //懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...

  2. Java单例模式之懒汉模式线程安全

    单例模式是设计模式中用得比较多的一种设计模式,它的主要优点有: 1.访问受控,保证访问的是唯一的实例. 2.由于只有一个实例,所以节省资源. 缺点: 灵活性低,如果对象的应用场景多变,则不适用单例模式 ...

  3. java 单例模式之线程安全的饿汉模式和懒汉模式

    转载博主:thankyou https://blog.csdn.net/twj13162380953/article/details/53869983 理解: 饿汉式获取实例的步骤简单所以线程更安全. ...

  4. java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern

    https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之   ...

  5. Java-设计模式-单例模式-饿汉模式、懒汉模式

    //-------------------------------------------------------------饿汉模式--开始----------------------------- ...

  6. java 单例模式-饿懒汉模式

    单例-饿汉模式 1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){}2.自己在类的内部创建一个唯一实例 private static Singleton insta ...

  7. Java单例模式之饿汉模式与懒汉模式

    单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...

  8. java双重检测或枚举类实现线程安全单例(懒汉模式)

    双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...

  9. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

随机推荐

  1. Java Socket编程之UDP

    UDP编程: 将要传输的数据定义成数据包(Datagram),在数据报中指明所要到达的Socket(主机地址和端口号),然后再将数据报发送出去. 相关操作类:     DatagramPacket   ...

  2. Android判断Service是否运行

    /**         * 用来判断服务是否运行.         * @param context         * @param className 判断的服务名字         * @ret ...

  3. HttpServletResponse返回页面弹窗

    下载方法: @RequestMapping(value = "/download.htm") public void downLoadFile(String id,HttpServ ...

  4. ShaderLab内置变量

    [ShaderLab内置变量]

  5. 75. Sort Colors (Array)

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  6. MonoBehaviour.print和Debug.Log是同样的作用

    MonoBehaviour.print("identical------------------------");

  7. UIImage分类,设置边框

    #import "UIImage+image.h" @implementation UIImage (image) + (UIImage *)imageWithBorder:(CG ...

  8. Java 面试知识点汇总

    OOP:(Object Oriented Programming )面向对象编程 重用性.灵活性和扩展性 高内聚.低耦合 面向过程编程与面向对象编程的区别:举例,自己做饭吃与去饭馆吃,去饭馆只需要知道 ...

  9. Linux Virtualization with Xen

    Xen is the new virtualization kid on the block. It's gaining visibility and importance at a speed on ...

  10. Oracle VM VirtualBox 部署CS devcloud2 开发环境

    Setting up (VirtualBox) 1. Get the new DevCloud 2.0 virtual appliance. The new image was created usi ...