1、Java中有哪几种引用?它们的含义和区别是什么?
从JDK1.2版本开始java把对象引用分为4个级别,级别由高到低分别为:强引用、软引用、弱引用和虚引用。
- 强引用 :直接引用对象,内存不足时也不会回收
- 软引用(SoftReference) :内存不足时,回收引用相关联的对象
- 弱引用(WeakReference) :无论内存是否充足,都回收引用相关联的对象
- 虚引用(PhantomReference) :任何时候都可以被垃圾回收器回收,
- 虚引用必须和引用队列 (ReferenceQueue)联合使用,垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中;
2、单例模式
单例模式是日常开发应用最广泛的一种设置模式,使用在这个模式时,单例对象的类必须保证只有一个实例对象存在,当我们想让某个对象只有一个实例时即可使用该模式;
创建单例对象的特点:
- 构造函数必须为private
- 一般通过一个静态方法或枚举返回当前实例
- 必须保证单例类对象是有一个,尤其在多线程情况下
- 确保单例类对象在反序列化时候不会重新创建一个对象
常见的单例实现方式 :
- 饿汉单例
- 懒汉单例
- 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;
}
}