单例模式
1.单例设置模式的特点:有且仅实例化一个对象
2.使用场景:加载配置信息 工具类 spring 容器对象的注入
3.有且仅实例化一个对象
A.私有的属性
B.私有的构造方法
C.公有的方法
4.单例设置模式的分类:饿汉 懒汉 双重锁 内部类 枚举(作业).....
懒汉式
谁用谁创建,线程不安全
代码:
public class Single {
//私有的属性
private static Single single;
//私有的构造
private Single(){
}
//公有的方法
public static Single getInstance(){
if (single== null){
single = new Single();
}
return single;
}
}
私有化的构造方法避免类在外部被实例化,只能通过 getInstance() 获得Single 对象
懒汉式加载在多线程中不安全,在并发环境下可能会实例多个Single对象。
解决懒汉式加载线程不安全问题:
1.同步方法—在 getInstance() 方法加上 synchronized
public static synchronized Single getInstance() {
if (single == null) {
single = new Single();
}
return single;
}
- 双重锁
public static synchronized Single getInstance() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
single = new Single();
}
}
}
return single;
}
饿汉式
类加载的时候就实例化对象;线程安全
public class Single {
private static Single single = new Single();
private Single() {
}
public static Single getInstance() {
return single;
}
}