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

什么是单例模式

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

单例模式有哪些要点

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值