1.描述下单例single

就是很多情况下一个类只能有一个实例,(比如代表配置文件的类)

2.单例实现

  • 懒汉模式(懒加载):首先将构造函数设成private型,定义一个static变量来存储实例,调用getInstance方法获取实例,方法内部判断实例是否已经创建,没有就新建一个,否则直接返回已有实例
  • 饿汉模式:定义变量的时候直接初始化
  • 线程安全:懒汉模式不是线程安全的,因为可能有两个线程同时判断出对象没实例化,于是创建了两个实例,饿汉模式一开始就初始化实例,所以始终只有一个,不需要再创建
  • 实例化时机不同:懒汉获取的时候才实例化,定义变量的时候就实例化
  • 延迟加载:懒汉模式需要的时候才创建,体现延迟加载,(可用于缓存,实例就是缓存,有了就不往缓存里放,没有才放)
  • 双重加锁,double-check:懒汉模式实现线程安全,每次获取实例的时候都要加锁同步,影响效率,所以在外面再加一层判断,对象是否实例化,如果已经实例化过了就不需要再进里面去加锁同步了,(变量要定义成volatile类型)/这还不是线程安全的?该还有将instance加个关键字volatile修饰,不然的话编译重排序可能造成还没初始化完成就已经完成对象引用的赋值,但是此时对象还没有初始化完毕。饱汉饿汉的区别 volatitle内存模型防止被优化/
  • *枚举实现单例最好
  • 一种是通过枚举,一种是通过静态内部类*

    3.如何高效实现单例子?

results matching ""

    No results matching ""