美文网首页
第八周 Java基础知识学习(引用,单例)

第八周 Java基础知识学习(引用,单例)

作者: 学石油的程序猿 | 来源:发表于2018-01-08 00:56 被阅读0次

话题:Java基础知识学习

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

  1. 强引用

只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

Obejct obj = new Object();
obj = null;//强行中断引用可以赋值为Null
  1. 软引用(SoftReference)

有用但是不必须对象 , 只有在内存不足的时候JVM才会回收该对象

Object obj = new Object();
SoftReference<Object> sr = new SoftReference<>(obj);
Object obj2 = sr .get();
  1. 弱引用(WeakReference)

当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象

Object obj = new Object();
WeakReference<Object> wr= new WeakReference<>(obj);
wr.get();
  1. 虚引用(PhantomReference)

虚引用不会决定对象的生命周期,如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解
被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

2、请用Java实现一个线程安全且高效的单例模式。

1.静态内部类

public class A {
    public A(){
    }
    public A getInstance(){
        return B.sInstance;
    }
    private static class B{
        private static final A sInstance = new A();
    }
}

利用类加载机制来保证只创建一个Instance实例,只要应用中不使用内部类,JVM就不会去加载这个单例类,也就不会去创建单例对象

不安全的地方:
(1) 可以被反射强行调用私有构造器
(2) 需要额外的工作来实现序列化,否则反序列化的时候,都会创建新的实例

静态内部类实现线程安全的原因:

  1. 内部类加载时机是在类被调用的时候,也就是A.getInstance(),B才会加载,属于延迟加载
  2. static 对象具有唯一性,只会在类加载的时候初始化一次

2.双重锁定检查(DCL)

public class A implements Serializable {
    private A(){
    }

    private static  volatile A sInstance ;

    public static A getInstance(){
            if (sInstance   != null){
                synchronized (A.this){
                    if (sInstance   != null){
                        sInstance   = new A();
                    }
                }
            }
        return sInstance;
    }

   //序列化安全
    private Object readResolve(){
        return sInstance;
    }
}

防止序列化,消除指令重排对单例的影响

相关文章

  • 第八周 Java基础知识学习(引用,单例)

    话题:Java基础知识学习 1、Java中有哪几种引用?它们的含义和区别是什么? 强引用 只要某个对象有强引用与之...

  • Java对象的引用及单例

    Java中对象引用及单例(第八周) 在 Java 中,它的内存管理包括两方面,内存分配和内存回收,这两方面都是由 ...

  • Java设计模式——单例模式

    前言 今天复习Java基础知识,正好看到了单例模式。惭愧的是,自己以前对单例模式一点都不清楚,现在重新学习了,自己...

  • 2020-11-02-Spring单例 vs. 单例模式

    Spring 单例不是 Java 单例。本文讨论 Spring 的单例与单例模式的区别。 前言 单例是 Sprin...

  • 枚举单例

    描述 本文先反编译枚举,再使用枚举实现单例 枚举 单例 单例源码 单例反编译 引用 http://www.benf...

  • 【Java】设计模式 —— 深入浅出单例模式

    学习笔记 参考:深入浅出单实例SINGLETON设计模式单例模式【Java】设计模式:深入理解单例模式 场景:一般...

  • Java中单例模式你用的哪一种?

    一起讨论java中的单例模式。单例模式是java设计模式中算是最简单的设计模式了。 * java实现单例模式的写法...

  • Java引用复习

    前言 Java引用是java的基础知识点,主要分为四种,强引用,软引用,弱引用,虚引用。 一、强引用 强引用是指对...

  • JAVA学习笔记(三)

    前言: 这周忙的不行,没学多少东西,就简单的学习下Java的单例吧。 设计模式之单例 单例模式是最简单也是最常用的...

  • JAVA中各种单例模式的实现与分析

    单例模式是学习设计模式过程中最基本的一个设计模式,基本上一开始学习就会学到单例模式,实际上在java中实现单例模式...

网友评论

      本文标题:第八周 Java基础知识学习(引用,单例)

      本文链接:https://www.haomeiwen.com/subject/ebymnxtx.html