静态内部类

静态内部类应用实例

代码演示

package com.atguigu.principle.singleton.type07;

/**
 * @author victor
 * @site https://victorfengming.github.io/
 * @company XDL
 * @project java_mode
 * @package com.atguigu.principle.singleton.type07
 * @created 2021-02-02 20:37
 * @function ""
 */
public class SingletonTest07 {

    public static void main(String[] args) {
        System.out.println("使用静态内部类完成单例设计模式!");
        Singleton ins = Singleton.getInstance();
        Singleton ins2 = Singleton.getInstance();
        System.out.println(ins);
        System.out.println(ins.hashCode());
        System.out.println(ins2);
        System.out.println(ins2.hashCode());
        System.out.println(ins == ins2);
        Singleton ins4 = Singleton.getInstance();
        System.out.println(ins4);
        /*
        * 使用静态内部类完成单例设计模式!
        com.atguigu.principle.singleton.type07.Singleton@1540e19d
        356573597
        com.atguigu.principle.singleton.type07.Singleton@1540e19d
        356573597
        true
        com.atguigu.principle.singleton.type07.Singleton@1540e19d

        * */
    }
}


// 静态内部类完成,推荐使用
class Singleton {
    private static volatile Singleton instance;

    // 构造器私有化
    private Singleton() {

    }

    // 写一个静态累不累,该类中有一个静态的属性,这个静态属性他有一个类型就是,Singleton
    private static class SingletonInstance {
        // 通过jvm底层装载机制保证了,这个是线程安全的
        private static final Singleton INSTANCE = new Singleton();
    }

    // 提供一个静态公有方法,直接返回SingletonInstance.INSTANCE
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

优缺点说明:

  1. 这种方式采用了类装载的机制来保证初始化实例时只有一个线程

  2. 静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化.

  3. 类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程时无法进入的

  4. 优点: 避免了 线程不安全 ,利用静态内部类特点实现延迟加载,效率高

  5. 结论: 推荐使用


results matching ""

    No results matching ""