单例设计模式使用场景:
统计登陆人数的计数器,获取配置文件类
单例设计模式的特点:
1、构造器私有
2、在一个Java应用程序中,可保证只有一个实例对象
3、只提供一个供外界调用的getInstance()方法
总结:一个静态的私有成员变量、一个私有构造方法,一个公共的获取实例方法
单例设计模式的优点:
1、减少某些对象的频繁创建,降低系统开销和内存占用
2、外部调用不使用new关键字,降低系统内存的使用频率
3、对于特殊的类,在系统中只能存在一个实例,否则系统无法正常运行,比如Controller
单例设计模式的实现:
饿汉式:该方式在成员位置声明Singleton类型的静态变量,并创建Singleton类的对象instance。instance对象是随着类的加载而创建的。如果该对象足够大的话,而一直没有使用就会造成内存的浪费。
/**
* @Auther: mojh
* @Date: 2022/05/26/11:33
* @Description: 饿汉式单例模式
*/
/*
1、静态的私用成员变量
2、私有的构造参数
3、获取实例的方法
*/
public class HungrySingleton {
private static HungrySingleton hungerySingleton = new HungrySingleton();
private HungrySingleton() {}
public HungrySingleton getHungerySingleton(){
return hungerySingleton;
}
}
**懒汉式**:懒汉模式中加锁的问题,对于 getInstance() 方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以我们没必让每个线程必须持有锁才能调用该方法,我们需要调整加锁的时机。由此也产生了一种新的实现模式:双重检查锁模式<br />双重检查锁模式是一种非常好的单例实现模式,解决了单例、性能、线程安全问题,上面的双重检测锁模式看上去完美无缺,其实是存在问题,在多线程的情况下,可能会出现空指针问题,出现问题的原因是JVM在实例化对象的时候会进行优化和指令重排序操作。<br />要解决双重检查锁模式带来空指针异常的问题,只需要使用 volatile 关键字, volatile 关键字可以保证可见性和有序性。<br />[<br />](https://blog.csdn.net/zouliping123456/article/details/79858576)
/**
* @Auther: mojh
* @Date: 2022/05/26/11:41
* @Description: 懒汉式单例模式(双重检查锁)
*/
public class LazySingleton {
private volatile static LazySingleton lazySingleton = null;
private LazySingleton(){}
public LazySingleton getLazySingleton(){
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}
参考链接:csdn链接