设计模式
单例模式
1. 单例设计模式的作用?
单例设计模式 保证在一个jvm中,该对象只有一个实例存在。
单例模式重点在于在整个系统上共享一些创建时比较耗资源的对象。整个应用只维护一个特定类实例,它被所有组件共同使用。
2. 单例模式的五种实现方式?
- 饿汉式:类初始化时创建单例,线程安全
- 懒汉式:创建实例单例的时候在创建,需要考虑线程安全。
- 双重检测锁: 效率高
- 静态内部类:可以同时保证延迟加载和线程安全
- 枚举类型:线程安全和防止反射调用构造器,还提供自动序列化机制,防止反序列化的时候创建新的对象
2.1 饿汉式:
也就是类加载的时候立即实例化对象,
实现的步骤是先私有化构造方法,对外提供唯一的静态入口方法
package com.wanghaha.desginPattern;
public class SingletonInstance {
// 声明此类型的变量,并实例化,当该类被加载的时候 就完成了实例化并保存在内存中
private final static SingletonInstance instance = new SingletonInstance();
// 私有化所有的构造方法,防止直接通过new关键字实例化
private SingletonInstance(){
}
// 对外提供一个获取实例的静态方法
public static SingletonInstance getInstance(){
return instance;
}
}
饿汉式单例设计模式代码中,static变量会在类加载时初始化,此时也不会涉及多个线程对象访问该对象的问题。虚拟机只会装载一次该类,肯定不会发生并发访问的问题。因此可以省略synchronized关键字。
存在问题: 如果只是加载本类,而不是调用getIntance(),甚至永远没有调用,则会造成资源的浪费
2.2 懒汉式
线程不安全,多个线程可能同时创建实例对象。
性能不太好。
package com.wanghaha.desginPattern;
public class SingletonInstance2 {
// 声明此类型的变量,并没有实例化
private static SingletonInstance2 instance = null;
// 私有化所有的构造方法,防止直接通过new关键字实例化
private SingletonInstance2(){
}
// 对外提供一个获取实例的静态方法,为了数据安全添加synchronized关键字
public static synchronized