什么是单例模式
某一个类在系统中有且只有一个实例对象被获取使用
单例模式有哪些要点
- 只能有一个实例对象,不能随意创建,必须私有化构造方法
- 唯一实例可以保存,静态变量是保存这个唯一的实例
- 必须向整个系统提供这个类的实例,直接暴露 或提供暴露方法
有多少种创建方式
有饿汉模式,懒汉模式两件创建方式
饿汉模式:
直接创建对象不会出现线程安全问题懒汉模式:
延迟创建,第一次使用时创建 会出现线程安全问题饿汉模式的创建方式:
直接创建
public class Singleton{
//实例化对象
private static Singleton singleton = new Singleton;
//私有化构造器
private Singleton(){}
//提供外部访问
public static Singletion getSingletion(){
return singleton;
}
}
特点:基于classLoader机制创建的 即使不加锁 执行效率很高,而且避免的线程安全问题
类加载时即初始化了实例,应此没有达到延迟加载的效果
枚举的方式创建
public enum Singleton{
singleton
}
特点: 实现简单,但是如果jdk不支持枚举类型就不能使用
静态代码块创建
public class Singleton{
private static Singleton singleton;
private Singleton(){}
static{
singleton=new Singleton();
}
public Singleton getSingleton(){
return singleton
}
特点: 类中可以写其他的功能,而且静态代码块中可以进行初始化操作
懒汉模式的创建方式
线程不安全的创建方式
public class LizySingleton{
private static LizySingleton lizySingleton;
private LizySingleton(){}
public staitc LizySingleton getLizySingleton(){
if(lizySingleton==null){
lizySingleton =new LizySingleton;
}
return lizySingleton;
}
}
}
特点: 第一次使用才会创建对象,减小内存消耗
线程安全的创建方式
public class LizySingleton{
private static LizySingleton lizySingleton;
private LizySingleton(){}
public static LizySingleton getLizySingleton(){
if(lizySingleton == null){
synchronized(this.lizySingleton){
lizySingleton =new LizySingleton;
}
}
}
}
特点: 第一次使用才会创建对象,减小内存消耗
缺点:必须加锁才能保证线程安全
静态内部类的创建方式
public class LizySingleton {
private LizySingleton() {}
private static class singleton{
//TODO
private static LizySingleton singleton = new LizySingleton();
}
public static LizySingleton03 getSingleton() {
return singleton.singleton;
}
}
特点: 在内部类被加载和初始化时才会被实例化
静态的内部类不会随着外部类的加载和初始化而加载和初始化的