Java中對(duì)象引用及單例(第八周)
在 Java 中,它的內(nèi)存管理包括兩方面,內(nèi)存分配和內(nèi)存回收,這兩方面都是由 Java 虛擬機(jī) (JVM)自動(dòng)幫我們完成的仅政,使得程序員可以把有限精力放到實(shí)現(xiàn)應(yīng)用的業(yè)務(wù)上去。但是盆驹,也正是因?yàn)閮?nèi)存管理完全由 JVM 替我們做了圆丹,或者項(xiàng)目趕工期,所以使得 Java 很多程序員不在關(guān)心內(nèi)存分配的問(wèn)題及內(nèi)存的優(yōu)化躯喇,導(dǎo)致許多程序低效辫封,耗內(nèi)存,這一點(diǎn)在手機(jī)客戶端開(kāi)發(fā)尤為明顯廉丽,臭名昭著的內(nèi)存泄漏 (OOM) 和內(nèi)存溢出倦微,想必是大多數(shù)手機(jī)開(kāi)發(fā)程序猿們都所厭惡的。作為小白的我正压,也在此學(xué)習(xí)鞏固一下這些問(wèn)題欣福。
一、Java中有哪幾種引用焦履?它們的含義和區(qū)別是什么拓劝?
java對(duì)象的引用方式:強(qiáng)引用、軟引用嘉裤、弱引用郑临、虛引用
1、強(qiáng)引用 (StrongReference)
作為 Java 程序猿的我們屑宠,每天都在創(chuàng)建各種對(duì)象厢洞,new Car()、new House()、new Girl()犀变、new Boy()都為我們創(chuàng)建各種 “美好生活”,然而我們大對(duì)數(shù)通過(guò) new?所創(chuàng)建的對(duì)象秋柄,都是強(qiáng)引用類型获枝,Java的垃圾回收機(jī)制 (GC) 是不會(huì)主動(dòng)回收強(qiáng)引用類型對(duì)象 (StrongReference),我們雖然用起來(lái)很爽骇笔,但是我們的手機(jī)內(nèi)存正在被一點(diǎn)點(diǎn)吃光省店,尤其那些書(shū)寫(xiě)不規(guī)范的代碼各種對(duì)對(duì)象引用和持有,使得我們應(yīng)用程序最終拋出 OutOfMemeryError 而告終 1看ァE嘲!
2芦劣、軟引用 (SoftReference)
軟引用粗俱,大家看到軟字上肯定都明白一丟丟啦,“軟”嘛虚吟!小伙子嘛寸认,肯定都懂得嘛,肯定好欺負(fù)一波嘛串慰,當(dāng)然這是相對(duì)于 Java 虛擬機(jī)而言啦偏塞,如果內(nèi)存夠空間足夠情況下,垃圾回收器就不會(huì)去回收它的邦鲫,相反如果內(nèi)存空間不足的情況下灸叼,就會(huì)被垃圾回收器所回收。
同時(shí)庆捺,軟引用可以和一個(gè)引用隊(duì)列 (ReferenceQueue) 聯(lián)合使用古今,如果軟引用所引用的對(duì)象被垃圾回收機(jī)制回收啦, Java 虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列之中滔以。
3沧卢、弱引用 (WeakReference)
弱引用,看完軟引用的童鞋肯定馬上聯(lián)想一波醉者,更是秒懂但狭,“弱”,“秒”撬即,算了還是認(rèn)真點(diǎn)吧 (嚴(yán)肅臉...) 立磁。相比軟引用,Java虛擬機(jī)只要在執(zhí)行垃圾回收時(shí)剥槐,不管此時(shí)的內(nèi)存空間足以不足唱歧,都會(huì)馬上回收釋放此塊內(nèi)存空間。
同時(shí),與軟引用類似颅崩,弱引用 (WeakReference)也可以結(jié)合引用隊(duì)列 (ReferenceQueue) 來(lái)使用几于,當(dāng) GC 觸發(fā)時(shí),導(dǎo)致弱引用對(duì)象被回收后沿后, JVM 也會(huì)把此引用加入到引用隊(duì)列之中沿彭。
4、虛引用 (PhantomReference)
老家有句俗話說(shuō):“老漢吃柿子尖滚,就挑軟的捏 :砹酢!漆弄!” 睦裳,就是指的虛引用,然而它也屬于對(duì)象引用中另類撼唾,它不同于前面的三種對(duì)象引用方式廉邑,如果一個(gè)對(duì)象持有虛引用,在任何時(shí)候都會(huì)被回收倒谷,它的 get() 方法直接返回就是 null 鬓催,它的單獨(dú)使用并沒(méi)有什么意義,必須和引用隊(duì)列一起使用恨锚,虛引用主要用來(lái)跟蹤被垃圾回收的活動(dòng)宇驾。
同時(shí),它在和引用隊(duì)列 (ReferenceQueue) 聯(lián)合使用時(shí)猴伶,當(dāng) JVM 在垃圾回收時(shí)课舍,會(huì)在回收對(duì)象之前,就把虛引用加入到關(guān)聯(lián)隊(duì)列之中他挎。
二筝尾、?用Java實(shí)現(xiàn)一個(gè)線程安全且高效的單例模式
單例模式有多種寫(xiě)法,餓漢式办桨、懶漢式筹淫、靜態(tài)內(nèi)部類式、枚舉式呢撞、雙重效驗(yàn)鎖
此處寫(xiě)本人用最多:
-----------------------------------------------別急 * 福利-----------------------------------------------
阿東咚
2018损姜、01、07