代码实现
本篇文章采用静态内部类的方式实现单例模式。代码如下
/**
* @Author: ming.wang
* @Date: 2019/2/20 15:46
* @Description:
*/
public class StaticInnerClassSingleton {
private StaticInnerClassSingleton() {}
private static class InnerClass{
private static StaticInnerClassSingleton instance=new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance(){
return InnerClass.instance;
}
}
原理分析
在分析原理之前,我们得了解一些基本前提
根据Java语言规范,在首次发生下列任意一种情况时,一个类或接口类型T将被立即初始化。
1)T是一个类,而且一个T类型的实例被创建。
2)T是一个类,且T中声明的一个静态方法被调用。
3)T中声明的一个静态字段被赋值。
4)T中声明的一个静态字段被使用,而且这个字段不是一个常量字段。
5)T是一个顶级类(Top Level Class,见Java语言规范的§7.6),而且一个断言语句(assert关键字修饰的语句)嵌套在T内部被执行。
Class对象的初始化锁
对于同一个classloader来说,加载某个class文件为Class对象时。为保证class文件只会被加载一次,所以每种class文件都会有一个锁。
当线程1执行StaticInnerClassSingleton.getInstance()这句代码的时候,内部类中的静态成员变量instance被赋值,由前面知道所以InnerClass立刻被初始化,此时线程1获得InnerClass类的初始化锁,直到InnerClass被完全初始化,即instance也完成了初始化。