静态内部类
静态内部类应用实例
代码演示
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;
}
}
优缺点说明:
这种方式采用了类装载的机制来保证初始化实例时只有一个线程
静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化.
类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程时无法进入的
优点: 避免了 线程不安全 ,利用静态内部类特点实现延迟加载,效率高
结论: 推荐使用