1 什么是单例模式
A 这些类只能有一个实例
B 这些能够自动实例化
C 这个类对整个系统可见,即鼻血面向整个系统提供这个实例
案例:应用程序主菜单,教室内只有一个黑板。
UML图
《单例模式》 Singleton
-------------------------------------
- Singleton singleton
----------------------------------
+ Singgleton getInstance()
2 单例模式分类
2.1 饿汉模式----直接创建 -----线程安全- (真正使用时再加载 类加载时不初始化)
2.2 懒汉模式 ---用的时候才加载------ 懒汉模式要加synchronize 保证线程安全-----(类初始化就实例化,类加载慢,但获取对象的速度快)
2.3 双检查
volatile 关键字的一个重要作用是禁止指令重排
其保证在弯沉给一个写操作 123 完成前 不会用读操作
3 懒汉模式要素
3.1 私有构造方法
3.2 指向自己实例的私有静态引用
3.3 以自己的实例作为返回值的静态公有方法
4 代码实现
4.1 饿汉模式------直接初始化 -- 使用使才初始化 方法 静态2个 直接弯沉初始化 公开1个静态获取:
public class Singleton{
//饿汉单例模式------直接创建---- //在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快private static Singleton singleton = new Singleton();
//静态私有成员,已初始化 private Single(){}; //私有构造函数 public static Singleton getInstance(){ //静态,不用同步(类加载时已初始化,不会有多线程的问题)return singleton;
}
}
4.2 懒汉模式----------很懒 用的时候才加载------ 关键字 synchronize
pulic class Singleton{
private static final Single instance = null ;
pubilic static sychronized getInstance(){
if (singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
4.3 双重锁---懒汉模式-非安全
public class Singleton{
private static volatile Singele instance = null;
private single(); //构造器私有 防止外部类调用
public static Singleton getInstance(){
if(instance == null){
synchronized(SingletonClass.class){
if(instance == null){
instance = new Single();
}
}
}
return instance;
}
}
5 单例模式的优点:
在内存上只有一个对象,节省内存空间
避免重复创建销毁,可以提高性能
避免对共享资源的多重占用
可以全局访问