1.singleton 是什么
单例:
单:唯一
例:实例
单例设计模式:即某个类在整个系统中只有一个实例对象被获取和使用的代码模式
例如:代表JVM运行环境的Runtime类
2.要点:
1)构造器私有化
2)含有该类的静态变量来保存这个实例
3)对外提供获取该实例的方式
a.直接暴露
b.用静态变量的get 方法获取
3.几种常见的形式
4.案例:
1)饿汉式:
使用:
1.2)静态代码块饿汉式
可以通过类加载器加载类路径下面的所有文件
出现的背景:
静态代码块需要获得一些数据,进行初始化
public class Singleton3 {
public static final Singleton3 INSTANCE;
private String info;
static{
try {
Properties pro = new Properties();
pro.load(Singleton3.class.getClassLoader().getResourceAsStream("single.properties"));
INSTANCE = new Singleton3(pro.getProperty("info"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private Singleton3(String info){
this.info = info;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
@Override
public String toString() {
return "Singleton3 [info=" + info + "]";
}
}
注意:线程安全 在类加载过程中 Clinit 时创建
2)懒汉式
2.1)线程安全版本:
public class Singleton5 {
private static Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getInstance(){
if(instance == null){
synchronized (Singleton5.class) {
if(instance == null){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton5();
}
}
}
return instance;
}
}
2.2)线程安全且写法简单(静态内部类)
1.静态内部类不会随着外部类的架子和初始化而初始化,它是要单独去加载和初始的,只有在被调用的时候,才加载和初始化
因为是在内部类加载时床架的,因此是线程安全的
public class Singleton6 {
private Singleton6(){
}
private static class Inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6 getInstance(){
return Inner.INSTANCE;
}
}