更新時(shí)間:2020-08-26 10:18:20 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1818次
Java單例設(shè)計(jì)模式教程中包含了單例模式的定義、特點(diǎn)以及線路安全等問(wèn)題。

單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、顯卡的驅(qū)動(dòng)程序?qū)ο蟪1辉O(shè)計(jì)成單例。這些應(yīng)用都或多或少具有資源管理器的功能。每臺(tái)計(jì)算機(jī)可以有若干個(gè)打印機(jī),但只能有一個(gè)Printer Spooler,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺(tái)計(jì)算機(jī)可以有若干通信端口,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口,以避免一個(gè)通信端口同時(shí)被兩個(gè)請(qǐng)求同時(shí)調(diào)用??傊x擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。
1. 單例類只能有一個(gè)實(shí)例。
2. 單例類必須自己創(chuàng)建自己的唯一實(shí)例。
3. 單例類必須給所有其他對(duì)象提供這一實(shí)例。
單例模式保證了全局對(duì)象的唯一性,比如系統(tǒng)啟動(dòng)讀取配置文件就需要單例保證配置的一致性。
一方面在獲取單例的時(shí)候,要保證不能產(chǎn)生多個(gè)實(shí)例對(duì)象,后面會(huì)詳細(xì)講到五種實(shí)現(xiàn)方式;
另一方面,在使用單例對(duì)象的時(shí)候,要注意單例對(duì)象內(nèi)的實(shí)例變量是會(huì)被多線程共享的,推薦使用無(wú)狀態(tài)的對(duì)象,不會(huì)因?yàn)槎鄠€(gè)線程的交替調(diào)度而破壞自身狀態(tài)導(dǎo)致線程安全問(wèn)題,比如我們常用的VO,DTO等(局部變量是在用戶棧中的,而且用戶棧本身就是線程私有的內(nèi)存區(qū)域,所以不存在線程安全問(wèn)題)。
還記得我們最早使用的MVC框架Struts1中的action就是單例模式的,而到了Struts2就使用了多例。在Struts1里,當(dāng)有多個(gè)請(qǐng)求訪問(wèn),每個(gè)都會(huì)分配一個(gè)新線程,在這些線程,操作的都是同一個(gè)action對(duì)象,每個(gè)用戶的數(shù)據(jù)都是不同的,而action卻只有一個(gè)。到了Struts2, action對(duì)象為每一個(gè)請(qǐng)求產(chǎn)生一個(gè)實(shí)例,并不會(huì)帶來(lái)線程安全問(wèn)題(實(shí)際上servlet容器給每個(gè)請(qǐng)求產(chǎn)生許多可丟棄的對(duì)象,但是并沒有影響到性能和垃圾回收問(wèn)題,有時(shí)間會(huì)做下研究)。

Java單例設(shè)計(jì)模式是java基礎(chǔ)知識(shí)中的一小部分,大家可要掌握哦。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)