單例模式分為兩大類:懶漢式和餓漢式
其最主要的區別在於:
懶漢式:指全域性的單例例項在第一次被使用時構建
餓漢式:指全域性的單例例項在類裝載時構建
日常我們使用的最多也是懶漢式,懶漢式是按需載入,能夠做到資源的最大利用
懶漢式:
雖然這樣寫沒什麼問題,但是如果是多執行緒時可能出現問題了,如果多個執行緒同時訪問 都判斷了instance是否為null可能會建立兩個例項
這時想到用synchronized加鎖
這樣的話如果兩個執行緒同時訪問的話就會有乙個是在等待,可以避免出現建立兩個例項的情況當然這還是會有效率問題就是每次只能乙個執行緒訪問,其他執行緒要等待
這裡做了兩次判斷,如果instance為null就鎖定,否側可以多個執行緒同時訪問,可以有效的解決single2中的效率問題
但是synchronized雖然保證了原子性,但卻沒***指令重排序的正確性,會出現a執行緒執行初始化,但可能因為建構函式裡面的操作太多了,所以a執行緒的uniqueinstance例項還沒有造出來,但已經被賦值了。而b執行緒這時過來了,錯以為uniqueinstance已經被例項化出來,一用才發現uniqueinstance尚未被初始化。我們的執行緒雖然可以保證原子性,但程式可能是在多核cpu上執行。加上可以有效的保證原子性,執行緒達到安全。
餓漢式:
在類裝載時構建,相對於懶漢式的問題來說這是乙個很完美的但也有很多缺點 :初始化太早,資源浪費,如果本省依賴其他資料,難以保證其他資料在它初始化之前準備好。
單例就講這麼多,學的還是不夠
設計模式之單例模式
前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...
設計模式之單例模式
package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...
設計模式之 單例模式
單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...