設計模式涉及建立型模式、結構型模式和行為型模式。面試之中最常考建立型模式中的單例模式和工廠模式(因為這兩個最簡單。。。)。總結一下單例模式,之後總結工廠模式。
public
class
singleton
;// 建立私有靜態例項,意味著這個類第一次使用的時候就會進行建立
private
static singleton instance =
newsingleton()
;public
static singleton getinstance()
// 瞎寫乙個靜態方法。這裡想說的是,如果我們只是要呼叫 singleton.getdate(...),
// 本來是不想要生成 singleton 例項的,不過沒辦法,已經生成了
public
static date getdate
(string mode)
}
餓漢模式的缺點是當有多個靜態方法時候,如果使用了非建立例項的靜態方法,此時是不希望生成例項的,但是靜態方法屬於類,統一執行的,已經生成例項了。所以一般不使用這個。
public
class
singleton
;// 建立私有靜態例項,意味著這個類第一次使用的時候就會進行建立
private
static singleton instance;
public
static singleton getinstance()
// 延遲建立例項,當呼叫方法的時候才會建立例項
public
static date getdate
(string mode)
}
public
class
singleton
// 和餓漢模式相比,這邊不需要先例項化出來,注意這裡的 volatile,它是必須的
private
static
volatile singleton instance = null;
public
static singleton getinstance()
}}return instance;
}}
第一次校驗:由於單例模式只需要建立一次例項,如果後面再次呼叫getinstance方法時,則直接返回之前建立的例項,因此大部分時間不需要執行同步方法裡面的**,大大提高了效能。如果不加第一次校驗的話,那跟上面的懶漢模式沒什麼區別,每次都要去競爭鎖。
第二次校驗:如果沒有第二次校驗,假設執行緒t1執行了第一次校驗後,判斷為null,這時t2也獲取了cpu執行權,也執行了第一次校驗,判斷也為null。接下來t2獲得鎖,建立例項。這時t1又獲得cpu執行權,由於之前已經進行了第一次校驗,結果為null(不會再次判斷),獲得鎖後,直接建立例項。結果就會導致建立多個例項。所以需要在同步**裡面進行第二次校驗,如果例項為空,則進行建立。
需要注意的是,private static volatile singleton3 singleton=null;需要加volatile關鍵字,否則會出現錯誤。問題的原因在於jvm指令重排優化的存在。在某個執行緒建立單例物件時,在構造方法被呼叫之前,就為該物件分配了記憶體空間並將物件的字段設定為預設值。此時就可以將分配的記憶體位址賦值給instance欄位了,然而該物件可能還沒有初始化。若緊接著另外乙個執行緒來呼叫getinstance,取到的就是狀態不正確的物件,程式就會出錯。
public
class
singleton3
// 主要是使用了 巢狀類可以訪問外部類的靜態屬性和靜態方法 的特性
private
static
class
holder
public
static singleton3 getinstance()
}
列舉類實現單例模式相當硬核,因為列舉型別是執行緒安全的,且只會裝載一次。使用列舉類來實現單例模式,是所有的單例實現中唯一一種不會被破壞的單例模式實現。
public
class
singletonobject
private
enum singleton
private singletonobject getinstance()
}public
static singletonobject getinstance()
}
雙重校驗鎖實現單例模式
1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...
單例模式的思想,餓漢模式,懶漢模式,雙重校驗鎖
單例模式 乙個類只有乙個物件 單例模式包括 餓漢模式和懶漢模式 懶漢模式 直到要用到例項時,才會去載入。時間換空間 缺點 在多執行緒併發情況下,會產生多個例項化物件,出現執行緒安全問題 重新上傳 取消 餓漢模式 一開始就載入好了,每次用到就直接返回 用空間換時間 重新上傳 取消 總結 1 單例模式類...
單例模式 雙重校驗鎖
單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...