Java引用类型、单例总结

271 阅读2分钟

 1、Java中有哪几种引用?它们的含义和区别是什么? 

   从JDK1.2版本开始java把对象引用分为4个级别,级别由高到低分别为:强引用、软引用、弱引用和虚引用。

  • 强引用 :直接引用对象,内存不足时也不会回收
  • 软引用(SoftReference) :内存不足时,回收引用相关联的对象
  • 弱引用(WeakReference) :无论内存是否充足,都回收引用相关联的对象
  • 虚引用(PhantomReference) :任何时候都可以被垃圾回收器回收,
    • 虚引用必须和引用队列 (ReferenceQueue)联合使用,垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中;

2、单例模式

单例模式是日常开发应用最广泛的一种设置模式,使用在这个模式时,单例对象的类必须保证只有一个实例对象存在,当我们想让某个对象只有一个实例时即可使用该模式;

创建单例对象的特点:

  1.  构造函数必须为private
  2. 一般通过一个静态方法或枚举返回当前实例
  3. 必须保证单例类对象是有一个,尤其在多线程情况下
  4. 确保单例类对象在反序列化时候不会重新创建一个对象

常见的单例实现方式 :

  • 饿汉单例
  • 懒汉单例
  • DCL单例
  • 静态内部类
  • 枚举单例

  单例的实例代码这里不一对一列出,具体实现后面如果有需要再单独总结列出;

3.请用Java实现一个线程安全且高效的

实现线程安全高效的单例有几种例如枚举单例,这里使用静态内部类实现实例demo如下:

public class SingletonStaticInternalClass {

  private SingletonStaticInternalClass() {}

  public static SingletonStaticInternalClass getInstance() {
    return SingletonHodler.INSTANCE;
  }

  private static class SingletonHodler {
    private static final SingletonStaticInternalClass INSTANCE = new SingletonStaticInternalClass();
  }

  //防止单例对象吧被反序列化重新生成对象
  private Object readResolve() throws ObjectStreamException {
    return SingletonHodler.INSTANCE;
  }
}