你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

单例模式(懒汉模式,饿汉模式)

2021-12-3 21:57:52

什么是单例模式

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

单例模式有哪些要点

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