java單例模式實例分析

這篇文章主要介紹“java單例模式實例分析”,在日常操作中,相信很多人在java單例模式實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java單例模式實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

十余年的志丹網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應快,48小時及時工作處理。營銷型網(wǎng)站的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整志丹建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“志丹網(wǎng)站設(shè)計”,“志丹網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

在早期的項目代碼中,如果我們想使用類的某個方法,我們基本都會創(chuàng)建一個類的對象實例然后再調(diào)用方法,這樣的實現(xiàn)往往在系統(tǒng)內(nèi)就會存在某個類的大量實例。如此一來,項目框架很難管理大量的對象,而且如果java虛擬機不能及時回收,容易造成內(nèi)存溢出。

首先我們要明白什么是單例,所謂單例就是說在項目框架內(nèi)某個類的對象實例只存在一個,任何調(diào)用方獲取到的對象實例都是一個,那么很明顯這個類是不能夠被外部直接調(diào)用類構(gòu)造器創(chuàng)建的。

我們先看下一個簡單的單例設(shè)計:

java單例模式實例分析

上面代碼在單線程是沒有問題的,而且只有當線程調(diào)用類的靜態(tài)方法時,才會生成類的靜態(tài)變量。但是當多線程訪問時,上面代碼是有問題的,會生成多個對象的實例。

那么,我們可以用另外一種方法實現(xiàn),比如說在類加載時候就初始化對象的實例,這樣后面無論怎么調(diào)用類靜態(tài)方法都不創(chuàng)建新的實例。還有一種方法,但是會犧牲部分系統(tǒng)性能,意思就是在多線程訪問方法時通過鎖機制讓線程排隊訪問。我們先通過在類方法上加鎖來實現(xiàn)類的單例,比如:

java單例模式實例分析

上述方法能實現(xiàn)單例,而且采用的思路是延遲加載,但是執(zhí)行效率比較低。

之前有看到部分同學使用雙重鎖(Double CheckLock)機制來實現(xiàn)單例模式,一方面需要在實例上加上volatile關(guān)鍵字通知操作系統(tǒng)實現(xiàn)線程訪問時內(nèi)存屏障,然后還需要在方法中通過虛擬機實現(xiàn)的synchronized來同步方法訪問,寫法如下:

java單例模式實例分析

反正,我認為上面的實現(xiàn)是比較復雜的,大家需要去了解的知識點比較多,比如volatile ,synchronized,內(nèi)存屏障。因此我不建議大家用這種方式,可以作為技術(shù)了解下還是有好處的,畢竟如果能跟面試官探討到這一步,還是會加一些分的。

如果說我們不考慮服務(wù)負載問題,在多線程環(huán)境下可以預先加載類的靜態(tài)實例,當虛擬機加載完成類后就會創(chuàng)建類的靜態(tài)變量,甭管你到時用不用,反正給你留在那里。所有線程訪問到的都是同一靜態(tài)實例,有人也稱這種方式為餓漢式,具體寫法如下:

java單例模式實例分析

上面寫法實現(xiàn)單例也是沒有問題的,但是有些同學就會覺得如果我只是想調(diào)用一個類的某個靜態(tài)方法,并不想生成它的實例,那有沒有其他方法呢,經(jīng)過各路大神的指點結(jié)合自身的總結(jié),可以使用內(nèi)部靜態(tài)類來實現(xiàn)這個需求。

開發(fā)的同學都知道,虛擬機在加載類的過程中一開始并不會初始化類的內(nèi)部靜態(tài)類。如果線程調(diào)用內(nèi)部靜態(tài)類時,虛擬機只會初始化一次,這樣既可以實現(xiàn)單例,同時也是線程安全的。具體寫法如下:

java單例模式實例分析

除了以上講到的幾種方式外,JDK自身的枚舉類型本身就是單例的實現(xiàn),調(diào)用者不能顯式的調(diào)用構(gòu)造器完成實例創(chuàng)建,因此很多Java規(guī)范文檔推薦使用枚舉來實現(xiàn)單例。

當然對于初級開發(fā)人員而言,現(xiàn)在的主流開發(fā)框架都提供單例/多例模式供開發(fā)者選擇,這樣的好處讓開發(fā)者更多關(guān)注業(yè)務(wù)功能開發(fā),而不用過多關(guān)注虛擬機內(nèi)部類實例創(chuàng)建問題。例如spring中默認類注入就是單例的,可以根據(jù)實際情況設(shè)置scope為singleton(單例)或者prototype(多例),如下圖所示:

java單例模式實例分析

到此,關(guān)于“java單例模式實例分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

文章名稱:java單例模式實例分析
本文來源:http://bm7419.com/article26/ipoojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、網(wǎng)站設(shè)計公司外貿(mào)建站、App開發(fā)、Google、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計