日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

java單例模式,單例模式懶漢和餓漢

Java單例模式簡(jiǎn)單嗎?

java單例模式,單例模式懶漢和餓漢


Java單例說(shuō)起來(lái)簡(jiǎn)單 , 很多初學(xué)者也學(xué)起來(lái)也認(rèn)為很簡(jiǎn)單 , 但是深入思考一下 , 就會(huì)發(fā)現(xiàn)沒(méi)那么簡(jiǎn)單 。單例要考慮到多線程并發(fā)訪問(wèn)的問(wèn)題 , 就會(huì)變得復(fù)雜起來(lái) 。如何保證線程安全?比較常見(jiàn)的方法就是使用DCL(Double Check Lock)單例 。實(shí)現(xiàn)代碼如下:這里還要特別注意 , INSTANCE前還需要加上volatile修飾符 。
為什么要加這個(gè)修飾符呢?這里就涉及到CPU底層的一些知識(shí)了 。簡(jiǎn)單來(lái)說(shuō) , CPU底層執(zhí)行指令的時(shí)候會(huì)對(duì)不同的指令進(jìn)行重排序 , 我們Java代碼里的一行代碼 , 在CPU底層可能是多條指令 , 如果發(fā)生了重排序 , 單例對(duì)象實(shí)例化過(guò)程中可能會(huì)把半初始化狀態(tài)的對(duì)象返回 , 那么當(dāng)前線程獲取到的實(shí)例與其他線程獲取的完全初始化的對(duì)象就不一樣了 。
單例模式有幾種?如何優(yōu)化?
在有些系統(tǒng)中 , 為了節(jié)省內(nèi)存資源、保證數(shù)據(jù)內(nèi)容的一致性 , 對(duì)某些類(lèi)要求只能創(chuàng)建一個(gè)實(shí)例 , 這就是所謂的單例模式 。單例模式的定義與特點(diǎn)單例(Singleton)模式的定義:指一個(gè)類(lèi)只有一個(gè)實(shí)例 , 且該類(lèi)能自行創(chuàng)建這個(gè)實(shí)例的一種模式 。例如 , Windows 中只能打開(kāi)一個(gè)任務(wù)管理器 , 這樣可以避免因打開(kāi)多個(gè)任務(wù)管理器窗口而造成內(nèi)存資源的浪費(fèi) , 或出現(xiàn)各個(gè)窗口顯示內(nèi)容的不一致等錯(cuò)誤 。
在計(jì)算機(jī)系統(tǒng)中 , 還有 Windows 的回收站、操作系統(tǒng)中的文件系統(tǒng)、多線程中的線程池、顯卡的驅(qū)動(dòng)程序?qū)ο蟆⒋蛴C(jī)的后臺(tái)處理服務(wù)、應(yīng)用程序的日志對(duì)象、數(shù)據(jù)庫(kù)的連接池、網(wǎng)站的計(jì)數(shù)器、Web 應(yīng)用的配置對(duì)象、應(yīng)用程序中的對(duì)話框、系統(tǒng)中的緩存等常常被設(shè)計(jì)成單例 。單例模式在現(xiàn)實(shí)生活中的應(yīng)用也非常廣泛 , 例如公司 CEO、部門(mén)經(jīng)理等都屬于單例模型 。
J2EE 標(biāo)準(zhǔn)中的 ServletContext 和 ServletContextConfig、Spring 框架應(yīng)用中的 ApplicationContext、數(shù)據(jù)庫(kù)中的連接池等也都是單例模式 。單例模式有 3 個(gè)特點(diǎn):?jiǎn)卫?lèi)只有一個(gè)實(shí)例對(duì)象;該單例對(duì)象必須由單例類(lèi)自行創(chuàng)建;單例類(lèi)對(duì)外提供一個(gè)訪問(wèn)該單例的全局訪問(wèn)點(diǎn) 。
單例模式的優(yōu)點(diǎn)和缺點(diǎn)單例模式的優(yōu)點(diǎn):?jiǎn)卫J娇梢员WC內(nèi)存里只有一個(gè)實(shí)例 , 減少了內(nèi)存的開(kāi)銷(xiāo) 。可以避免對(duì)資源的多重占用 。單例模式設(shè)置全局訪問(wèn)點(diǎn) , 可以?xún)?yōu)化和共享資源的訪問(wèn) 。單例模式的缺點(diǎn):?jiǎn)卫J揭话銢](méi)有接口 , 擴(kuò)展困難 。如果要擴(kuò)展 , 則除了修改原來(lái)的代碼 , 沒(méi)有第二種途徑 , 違背開(kāi)閉原則 。在并發(fā)測(cè)試中 , 單例模式不利于代碼調(diào)試 。
在調(diào)試過(guò)程中 , 如果單例中的代碼沒(méi)有執(zhí)行完 , 也不能模擬生成一個(gè)新的對(duì)象 。單例模式的功能代碼通常寫(xiě)在一個(gè)類(lèi)中 , 如果功能設(shè)計(jì)不合理 , 則很容易違背單一職責(zé)原則 。單例模式看起來(lái)非常簡(jiǎn)單 , 實(shí)現(xiàn)起來(lái)也非常簡(jiǎn)單 。單例模式在面試中是一個(gè)高頻面試題 。希望大家能夠認(rèn)真學(xué)習(xí) , 掌握單例模式 , 提升核心競(jìng)爭(zhēng)力 , 給面試加分 , 順利拿到 Offer 。
單例模式的應(yīng)用場(chǎng)景對(duì)于 Java 來(lái)說(shuō) , 單例模式可以保證在一個(gè) JVM 中只存在單一實(shí)例 。單例模式的應(yīng)用場(chǎng)景主要有以下幾個(gè)方面 。需要頻繁創(chuàng)建的一些類(lèi) , 使用單例可以降低系統(tǒng)的內(nèi)存壓力 , 減少 GC 。某類(lèi)只要求生成一個(gè)對(duì)象的時(shí)候 , 如一個(gè)班中的班長(zhǎng)、每個(gè)人的身份證號(hào)等 。某些類(lèi)創(chuàng)建實(shí)例時(shí)占用資源較多 , 或?qū)嵗臅r(shí)較長(zhǎng) , 且經(jīng)常使用 。

推薦閱讀