优缺点说明:
1) 这种方式采用了类装载的机制来保证初始化实例时只有一个线程。
2) 静态内部类方式在Singleton6类被装载时并不会立即实例化,而是在需要实例化
时,调用getInstance方法,才会装载Singleton6Instance类,从而完成Singleton6的
实例化。
3) 类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们
保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。
4) 优点:避免了 线程不安全,利用静态内部类特点实现延迟加载,效率高
5) 结论:推荐使用.
代码实现:
package com.it.singleton;
/*双重检查(线程安全)*/
public class Singleton6 {
/*私有的构造器,外部不能new对象实例*/
private Singleton6(){
}
/* 创建私有静态内部类,有一个静态属性Singleton6
* 在外部类被装载时静态内部类并不会别装载
* 静态内部类不会自动初始化,只有调用静态内部类的方法,静态域,或者构造方法的时候才会加载静态内部类
* 且静态内部类在装载时是线程安全的
*/
private static class Singleton6Instance{
/*static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。*/
private static final Singleton6 INSTABCE = new Singleton6();
}
/*
* 提供一个静态公有方法,当使用Singleton6Instance.INSTABCE,静态内部类才开始装载
* */
public static Singleton6 getInstance(){
return Singleton6Instance.INSTABCE;
}
}
测试:
package com.it.singleton.test;
import com.it.singleton.Singleton6;
public class SingletonTest6 {
public static void main(String[] args) {
Singleton6 instance1 = Singleton6.getInstance();
Singleton6 instance2 = Singleton6.getInstance();
System.out.println(instance1 == instance2);//true 同一对象
System.out.println(instance1.hashCode() == instance2.hashCode());//true
}
}