/**

  • 懒汉式
    *

  • 线程安全,在进行类初始化的时候就实例化了
    *

*/

class Instance0 {
    private static Instance0 instance = new Instance0();;

    private Instance0(){}

    public static Instance0 getInstance() {
        return instance;
    }

}

/**

  • 饿汉式
    *

  • 线程不安全的单列模式
    *

*/

class Instance1 {

    private static Instance1 instance;

    private Instance1(){}

    public static Instance1 getInstance() {
        if(instance == null) {
            instance = new Instance1();
        }
        return instance;
    }
}

/**

  • 饿汉式
    *

  • 线程安全的单列模式, 但是效率不佳.

  • 因为所有的线程都需要同步等待获取单例对象
    *

*/

class Instance2 {

    private static Instance2 instance;

    private Instance2(){}

    public static synchronized Instance2 getInstance() {
        if(instance == null) {
            instance = new Instance2();
        }
        return instance;
    }
}

/**

  • 饿汉式
    *

  • 线程安全的单列模式, 效率由于上面一种饿汉的方式.

  • 因为所有的线程都需要同步等待获取单例对象
    *

*/

class Instance3 {

    private static Instance3 instance;

    private Instance3(){}

    public static Instance3 getInstance() {
        if(instance == null) {
            synchronized(Instance3.class) {
                if(instance == null) {
                    instance = new Instance3();
                }
            }
        }
        return instance;
    }
}

/**

  • 静态类
    *

  • 饿汉的方式来生成单例,在需要的时候才会进行实例化.
    *

  • JVM在创建新对象的时候主要经历三个步骤:

  • 1.分配内存

  • 2.构造函数内存初始化

  • 3.将对象指向分配的内存地址
    *

  • JVM会针对字节码进行调优,其中一项调优便是跳转指令的执行顺序,如果1->3->2的顺序,上面的方式会出现在多线程访问的过程中可能会出现莫名的错误.
    *

*/

class Instance4 {

    private static class InstanceHolder {
        private static final Instance4 instance = new Instance4();
        private int a;
    }

    private Instance4(){}

    public static Instance4 getInstance()  {
        return InstanceHolder.instance;
    }

}

博予liutxer
266 声望14 粉丝

专业写代码的代码仔。