什么是单例模式

某一个类在系统中有且只有一个实例对象被获取使用

单例模式有哪些要点


  1. 只能有一个实例对象,不能随意创建,必须私有化构造方法
  2. 唯一实例可以保存,静态变量是保存这个唯一的实例
  3. 必须向整个系统提供这个类的实例,直接暴露 或提供暴露方法

有多少种创建方式

有饿汉模式,懒汉模式两种创建方式

饿汉模式:

直接创建对象不会出现线程安全问题

懒汉模式:

延迟创建,第一次使用时创建 会出现线程安全问题

饿汉模式的创建方式:

直接创建

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(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;
}
}
特点: 在内部类被加载和初始化时才会被实例化
静态的内部类不会随着外部类的加载和初始化而加载和初始化的