Singleton:
在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。
单:唯一
例:实例
单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。
常见方式
1. 饿汉式:
直接创建对象,不存在线程安全问题
直接实例化饿汉式(简洁直观)
/**
* 1、构造器私有化
* 2、自行创建、并用静态变量保存
* 3、向外提供这个实例
* 4、强调这是一个单例、可以用final修饰
*/
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton(){
}
}
枚举式(最简洁)
public enum Singleton {
INSTANCE
}
静态代码块饿汉式(适合复杂实例化)
public class Singleton {
public static final Singleton INSTANCE;
private String info;
static{
try{
// 对info进行初始化, 此外构造函数无法捕获异常,但是静态代码块可以捕获异常
INSTANCE = new Singleton(info);
}catch(Exception e){
throw new RuntimeException(e);
}
}
private Singleton(String info){
this.info = info;
}
}
2. 懒汉式:
延迟创建对象
线程不安全(适用于单线程)
public class Singleton {
private static Singleton INSTANCE;
private Singleton(){
}
public static Singleton getSingleton(){
return new Singleton();
}
}
线程安全 (适用于多线程)
public class Singleton {
private static Singleton INSTANCE;
private Singleton(){
}
public static Singleton getSingleton(){
if (INSTANCE == null){
synchronized (Singleton.class){
if (INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
静态内部类形式(适用于多线程)
/**
* 1、静态内部类不会随着外部类的加载和初始化而初始化,它要单独去加载和初始化
* 2、在内部类被加载和初始化时,才创建INSTANCE实例
*/
public class Singleton {
private Singleton(){
}
private static class Inner{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getSingleton(){
return Inner.INSTANCE;
}
}
*** JVM底层的指令重排,上述懒汉式也不再绝对是线程安全的,可以加上volatile关键字。
*** SpringBean 默认情况下都是单例。是否线程安全,得看是否运行在多线程环境下,实例是否有状态。