一.核心作用:
保证一个类只有一个实例,并且提供一个访问实例的全局访问点
二.常见的使用场景:
windows的任务管理器
windows的回收站
在seivlet编程中,每个Servlet也是单例的
在spring中,每个Bean默认就是单例的
。。。。。。
三.优点:
由于单例模式只生成一个实例,减少了系统性能开销。
单例模式可以在系统设置全局访问点,优化共享资源的访问。
单例模式可以说只要是一个合格的开发都会写,但是如果深究,小小的单例 模式牵扯到很多东西。
四.常见的五种单例模式实现方式:
饿汉式(线程安全,调用效率高,不能延时加载)
懒汉式(线程安全,调用效率不高,可以延时加载<调用的时候才加载类>)
DCL懒汉式(由于JVM底层模型的原因,偶尔效率高,可以延时加载)
饿汉式改进:静态内部类式(线程安全,调用效率高,可以延时加载)
枚举单例(线程安全,调用效率高,不能延时加载)
4.1饿汉式
//饿汉式单例
public class SingletonDemo01{
//1.私有化构造器
private SingletonDemo01() {
}
//2.类初始化的时候,立即加载该对象(饿汉)
private static SingletonDemo01 inSingletonDemo01= new SingletonDemo01();
//3.提供获取该对象的方法
public static SingletonDemo01 getInSingletonDemo01() {
return inSingletonDemo01;
}
public static void main(String[] args) {
SingletonDemo01 inDemo01=SingletonDemo01.getInSingletonDemo01();
SingletonDemo01 inDemo012= SingletonDemo01.getInSingletonDemo01();
System.out.println(inDemo01==inDemo012);
}
}
运行结果为:
饿汉式存在的问题:如果在类中加入开辟内存空间的方法时,很浪费内存。
4.2懒汉式:
//懒汉式
public class SingletonDemo03 {
//1.私有化构造器
private SingletonDemo03() {
}
//2.类初始化的时候,不立即加载对象
private static SingletonDemo03 inDemo03;
//3.提供获取该对象的方法,有synchronized效率会低
public static synchronized SingletonDemo03 getinDemo03() {
if(inDemo03==null) {
inDemo03=new SingletonDemo03();
}
return inDemo03;
}
public static void main(String[] args) {
SingletonDemo03 inSingletonDemo03 =SingletonDemo03.getinDemo03();
SingletonDemo03 inSingletonDemo032=SingletonDemo03.getinDemo03();
System.out.println(inSingletonDemo03==inSingletonDemo032);
}
}
运行结果:
懒汉式存在的问题保证了现在安全有符合懒加载,但是效率低下。