- 饿汉式单例模式
- 提前创建一个实例
public class SingletonClass1 {
// 初始化阶段就创建一个实例
private static final SingletonClass1 singletonClass1 = new SingletonClass1();
// 通过静态方法获取实例
public static SingletonClass1 getInstance(){
return singletonClass1;
}
// 构造器私有
private SingletonClass1() {
}
}
- 懒汉式单例模式
- 不提前创建一个实例
public class SingletonClass2 {
private static volatile SingletonClass2 singletonClass2;
// 通过静态方法获取实例时才去创建一个实例,如果存在则不创建直接获取
public static SingletonClass2 getInstance(){
if(singletonClass2 == null){
synchronized (SingletonClass2.class){
if(singletonClass2 == null){
singletonClass2 = new SingletonClass2();
}
}
}
return singletonClass2;
}
// 构造器私有
public SingletonClass2() {
}
}
- 静态内部类单例模式
- 通过静态内部类获取实例
- JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的
public class SingletonClass3 {
// 初始化阶段静态内部类不会被初始化
private static class Singleton{
private static final SingletonClass3 singletonClass3 = new SingletonClass3();
}
// 调用静态方法时,通过外部类调用静态内部类才会初始化静态内部类
public static SingletonClass3 getInstance(){
return Singleton.singletonClass3;
}
// 构造器私有
private SingletonClass3() {
}
}
- 注意:实现一个单例有两点注意事项
- 将构造器私有,不允许外界通过构造器创建对象;
- 通过公开的静态方法向外界返回类的唯一实例。
- 这里有一个问题可以思考:Spring的IoC容器可以为普通的类创建单例,它是怎么做到的呢?(将bean的作用域设置为singleton)
参考: