單例模式和靜態(tài)類的區(qū)別(Difference between static class and singleton pattern)

這個問題的答案引用Jon Skeet 回答

首先明確的是兩個都是線程安全的灿巧,兩者間最大的區(qū)別就是單例可以實現(xiàn)接口(Ps: 或者繼承基類蜡歹,雖然這種方式很少見),所以你可以當成一個問題的兩種不同實現(xiàn)方式。實際上弟孟,首先Singleton是對象(實例),而用static修飾class的時候是方法集合,其次單例是一種設計思想。 看代碼:

```

publicclassSingleton {privatestaticSingleton s =null;privateSingleton() { }publicstaticSingletongetInstance() {if(s ==null) s =newSingleton();returns;

}publicvoidfun() {/* some code */}publicstaticvoidstaticfun() {/* some code */}publicstaticvoidmain(String[] args) {

Singleton.getInstance().fun();

Singleton.staticfun();

}

}

```

1. 首先明確一下扎酷,靜態(tài)成員并不是什么程序加載時創(chuàng)建并初始化的,而是類加載時進行遏匆。類的加載是第一次真正用到它的時候(拿類new實例或調用它的靜態(tài)方法)進行的法挨,而這個加載過程需要將 class 文件中構成類的靜態(tài)和實例方法等類的成員的字節(jié)碼指令一同加載到內存中,而后要為靜態(tài)域分配存儲空間并使用靜態(tài)塊對其進行初始化(如果有的話)幅聘。在上面例子中凡纳,類加載后,所有成員(包括fun和staticfun)的字節(jié)碼指令均在內存中了帝蒿,隨時等待著調用荐糜,并且靜態(tài)域 s 所占用的存儲空間也用空引用初始化好了。

2. 從內存上來看,當?shù)谝淮握{用 getInstance() 方法時會創(chuàng)建此類的唯一實例(所謂的單例出現(xiàn))暴氏,其實也可以在聲明 s 時 new 它的唯一實例延塑,將實例化延后是為了避免類加載后實例使用前內存的浪費。

3. 靜態(tài)方法線程是安全的答渔,所謂線程安不安全是指當多個線程同時操作一個對象(通過調用它的實例方法)時是否會造成對象內部狀態(tài)的破壞关带,而靜態(tài)方法不是用來對實例進行操作的,所以一般不用考慮線程同步沼撕。如果在靜態(tài)方法中讀寫文件宋雏,此時如果多個線程同時通過調用此靜態(tài)方法對文件操作肯定會造成文件內容的破壞,但這不是線程沒同步造成的务豺,因為沒有對象的狀態(tài)被破壞磨总。但可以利用線程同步機制防止上面情況的發(fā)生。

4.從生命周期上來看冲呢,靜態(tài)方法的類會在代碼編譯的時候就被加載舍败,靜態(tài)方法中產(chǎn)生的對象,會隨著靜態(tài)方法執(zhí)行完畢而釋放掉敬拓,而且執(zhí)行類中的靜態(tài)方法時邻薯,不會實例化靜態(tài)方法所在的類。如果用單例模式, 產(chǎn)生的那一個唯一的實例乘凸,會一直在內存中厕诡,不會被GC清除的(原因是靜態(tài)的屬性變量不會被GC清除),除非整個應用退出了JVM (所以實際應用中更多的是靜態(tài)方法中獲取單例)

5. 單例模式是利用唯一的實例保存系統(tǒng)的狀態(tài)营勤,提供的實例方法也是為了對這個唯一的實例進行操作灵嫌,而靜態(tài)方法多是一些工具方法,Math 類中的靜態(tài)方法就是一個典型的例子葛作,如果僅僅是想不自己創(chuàng)建類的實例就可以調用到某些方法來完成一定的操作寿羞,那完全沒必要也不應該使用單例模式。

6. 從執(zhí)行效率上看: 靜態(tài)方法與實例方法赂蠢,在加載時機和占用內存上绪穆,靜態(tài)方法和實例方法是一樣的,在類型第一次被使用時加載虱岂。調用的速度基本上沒有差別玖院。 但是從日志打印來看,個人感覺還是靜態(tài)方法在執(zhí)行效率上快一點第岖。

6. 靜態(tài)方法是面向過程的难菌,而非面向對象的編程思想

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔑滓,隨后出現(xiàn)的幾起案子郊酒,更是在濱河造成了極大的恐慌遇绞,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猎塞,死亡現(xiàn)場離奇詭異试读,居然都是意外死亡,警方通過查閱死者的電腦和手機荠耽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門钩骇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铝量,你說我怎么就攤上這事倘屹。” “怎么了慢叨?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵纽匙,是天一觀的道長。 經(jīng)常有香客問我拍谐,道長烛缔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任轩拨,我火速辦了婚禮践瓷,結果婚禮上,老公的妹妹穿的比我還像新娘亡蓉。我一直安慰自己晕翠,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布砍濒。 她就那樣靜靜地躺著淋肾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爸邢。 梳的紋絲不亂的頭發(fā)上樊卓,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音杠河,去河邊找鬼简识。 笑死,一個胖子當著我的面吹牛感猛,可吹牛的內容都是我干的。 我是一名探鬼主播奢赂,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼陪白,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了膳灶?” 一聲冷哼從身側響起咱士,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤立由,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后序厉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锐膜,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年弛房,在試婚紗的時候發(fā)現(xiàn)自己被綠了道盏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡文捶,死狀恐怖荷逞,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情粹排,我是刑警寧澤种远,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站顽耳,受9級特大地震影響坠敷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜射富,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一膝迎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辉浦,春花似錦弄抬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弛槐,卻和暖如春懊亡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乎串。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工店枣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叹誉。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓鸯两,卻偏偏與公主長得像,于是被迫代替她去往敵國和親长豁。 傳聞我的和親對象是個殘疾皇子钧唐,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容