Java后端技术全栈|快速掌握并发编程---深入学习ThreadLocal( 三 )


对象引用
在Java里万事万物皆对象 , 这里有个对象 , 那么对象引用是什么呢?
Useruser=newUser(''老田'');
关于上面这段代码的解释 , 很大部分人会说user是个对象 。
一开始培训机构什么书籍里都说user是个对象 , 于是也就这么叫user是对象 , 这里的user指向了对象''老田'' 。 这里的Useruser是定义了一个对象引用 , 可以指向任意的User对象 , 比如:
Useruser;user=newUser(''张三'');user=newUser(''李四'');
一个队对象被user引用了 , 这里user把他叫做对象引用 。
对象引用就好比男人 , 对象就是男人的老婆 。 根据目前我国法律规定 , 一个男人在任何时候最多只能有一个老婆 , 但是一辈子可以娶多个老婆 。 哈哈哈!!!
另外如果是下面
inta;a=1;a=100;
这里的a , 我们通常称之为变量 。 所以上面的user我们也可以理解为变量 。
在Java里对象的引用也是分几种类型的 , 分以下四种类型:
强引用
软引用
弱引用
虚引用
强引用
强引用就是我们平时开发中用的最多的 , 比如说:
Personperson=newPerson(''老田'');
这个person就是强引用 。
当一个对象被强引用时候 , JVM垃圾回收的时候是不会回收的 , 宁愿执行OOM(OutOfMemory)异常也绝不回收 , 因为JVM垃圾回收的时候会认为这个对象是被用户正在使用 , 若回收了很有可能造成无法想象的错误 。
软引用
如果一个对象具有软引用 , 内存空间足够 , JVM垃圾回收器就不会回收它;如果内存空间不足了 , 就会回收这些对象的内存 。 只要垃圾回收器没有回收它 , 该对象就可以被程序使用 。 软引用可用来实现内存敏感的高速缓存 , 比如网页缓存、图片缓存等 。
使用软引用能防止内存泄露 , 增强程序的健壮性 。
java.lang.ref.SoftReference的特点是它的一个实例保存对一个Java对象的软引用 , 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收 。
也就是说 , 一旦SoftReference保存了对一个Java对象的软引用后 , 在垃圾线程对这个Java对象回收前 , SoftReference类所提供的get()方法返回Java对象的强引用 。
/***Returnsthisreferenceobject'sreferent.Ifthisreferenceobjecthas*beencleared,eitherbytheprogramorbythegarbagecollector,then*thismethodreturns<code>null</code>.**@returnTheobjecttowhichthisreferencerefers,or*<code>null</code>ifthisreferenceobjecthasbeencleared*/publicTget(){To=super.get();if(o!=null&&this.timestamp!=clock)this.timestamp=clock;returno;}
如果引用对象被清除或者被GC回收 , 这个get方法就返回null 。
弱引用
弱引用也是用来描述非必需对象的 , 当JVM下一次进行垃圾回收时 , 无论内存是否充足 , 都会回收被弱引用关联的对象 。 在java中 , 用java.lang.ref.WeakReference类来表示 。
与软引用不同的是 , 不管是否内存不足 , 弱引用都会被回收 。
弱引用可以结合来使用 , 当由于系统触发gc , 导致软引用的对象被回收了 , JVM会把这个弱引用加入到与之相关联的ReferenceQueue中 , 不过由于垃圾收集器线程的优先级很低 , 所以弱引用不一定会被很快回收 。
虚引用
虚引用和前面的软引用、弱引用不同 , 它并不影响对象的生命周期 。 在java中用java.lang.ref.PhantomReference类表示 。 如果一个对象与虚引用关联 , 则跟没有引用与之关联一样 , 在任何时候都可能被垃圾回收器回收 。
注意:虚引用必须和引用队列关联使用 , 当垃圾回收器准备回收一个对象时 , 如果发现它还有虚引用 , 就会把这个虚引用加入到与之关联的引用队列中 。 程序可以通过判断引用队列中是否已经加入了虚引用 , 来了解被引用的对象是否将要被垃圾回收 。 如果程序发现某个虚引用已经被加入到引用队列 , 那么就可以在所引用的对象的内存被回收之前采取必要的行动 。


推荐阅读