美文网首页
Java中单列模式的写法

Java中单列模式的写法

作者: Herman7z | 来源:发表于2018-06-28 17:33 被阅读0次
第一种 饿汉式
public class A {
    private static A a = new A();
    private A() {    }
    public static A getInstance() {
        return a;
    }
}

缺点: 类加载的时候就会初始化,没有有懒加载的效果

第二种 懒汉式
public class A {
    private static A a = null;
    private A() {    }
    public static synchronized A getInstance() {
        if (a == null) {
            a = new A();
        }
        return a;
    }
}

缺点: 每次调用方法都会去获取锁,影响性能

第三种 双从检查锁定和volatile (推荐)
public class A {
    private volatile static A a = null;   //   标注1
    private A() {    }
    public static A getInstance() {
        if (a == null) {            // 标注3
            synchronized (A.class) {
                if (a == null) {
                    a = new A();     // 标注2
                }
            }
        }
        return a;
    }
}

标注2 : new A() 这个操作会被翻译成三步执行,

  • memory = allocate(); //1. 分配对象的内存空间
  • ctorInstance(memory); //2. 初始化对象
  • instance = memory; //3. 设置instance指向刚分配的内存地址
    这三个操作中2,3 可能会被编译器或者处理器优化重新排序,先执行3,在执行2,那么如果同时有线程A 执行到了 标注3,线程B 执行到了标注2*,对于A 线程来说拿到的 a 引用不等于空,所以直接return

标注1: 为了解决上面的问题,加了volatile;禁止了重新排序,具体参考volatile的重新排序规则

第四种: 基于类初始化
public class A {
    private static class InstanceHolder {
        private static A a = new A();
    }
    public static A getInstance() {
        return InstanceHolder.a;   // 这里将导致InstanceHolder类被初始化
    }
}

JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在执行初始化期间,JVM会去获取一个锁。

image.png

相关文章

  • Java中单列模式的写法

    第一种 饿汉式 缺点: 类加载的时候就会初始化,没有有懒加载的效果 第二种 懒汉式 缺点: 每次调用方法都会去获取...

  • Kotlin中的单例模式与Java对比

    目前java中的单例模式有多种写法,kotlin中的写法更多一点,本篇会总结全部的到单例模式写法。 一、懒人写法(...

  • Java中单例模式你用的哪一种?

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。 * java实现单例模式的写法...

  • java 单列模式

    1. 饿汉式 懒汉式 解释 获取配置文件的输入流 synchronized为锁

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • Java四种单例设计模式

    Java中的四种单例模式 单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。 1.基本单例模式...

  • 单列模式的四种写法

    1、懒汉模式(线程不安全的) 2、饿汉模式(线程安全的) 3、延迟加载的饿汉模式(线程安全,而且节省资源,类加载时...

  • 你真的了解单例模式么

    应用最广的模式,单列模式 单列模式是用用最广的模式之一。 在应用这个模式的时候,单例对象的类必须在整个应用中只有一...

  • 设计模式之-单列模式

    设计模式-单列模式8种方式 1.饿汉式(静态常量) 优缺点说明:优点:这种写法比较简单,在类装载的时候就完成初始化...

  • SpringXML解析

    Spring XML解析的抽象工厂模式写法:类:BeanDefinitionParserDelegate.java...

网友评论

      本文标题:Java中单列模式的写法

      本文链接:https://www.haomeiwen.com/subject/uatnyftx.html