單例的兩種實現:
1、立即載入(餓漢模式)
public class singleton
public static singleton getinstance()
}
在方法呼叫之前,就已經建立好了例項,故不存在多執行緒安全的問題。
2、延遲載入(懶漢模式)
public class singleton
public static singleton getinstance()
return singleton;}}
延遲載入的缺點:在多執行緒的情況下,無法保證單例,會建立出「多例」。
測試:
public class singleton
public static singleton getinstance()
} catch (interruptedexception e)
return singleton;}}
public class mythread extends thread
}
public class run
}
測試結果;
結果列印出了兩種hashcode,說明建立了兩個物件,並非單例。
解決方案:
1、採用同步方法
synchronized public static singleton getinstance()
} catch (interruptedexception e)
return singleton;
}
2、使用雙檢查鎖
public static singleton getinstance()}}
} catch (interruptedexception e)
return singleton;
}
此方法只是鎖住了部分**,效率明顯提高。 多執行緒 單例模式與多執行緒
一 前言 如何使單例模式遇到多執行緒是安全的 正確的?我們在學習設計模式的時候知道單例模式有懶漢式和餓漢式之分。簡單來說,餓漢式就是在使用類的時候已經將物件建立完畢,懶漢式就是在真正呼叫的時候進行例項化操作。二 餓漢式 多執行緒 public class myobject public static...
單例模式與多執行緒
立即載入就是使用類的時候已經將物件建立完畢,常見的實現辦法就是直接new例項化,在呼叫方法前例項已經被建立了.利用getinstance 獲得乙個物件.延遲載入就是在呼叫get 方法時例項才被建立,常見的實現辦法就是在get 方法中進行new例項化,在呼叫方法時例項才被建立.利用get 獲得乙個物件...
單例模式與多執行緒
程式 上面的就是典型的 餓漢模式 就是急不可耐,一上來就初始化物件。那能不能使用的時候才例項化物件呢?也就是希望延遲載入,這就是所謂的 懶漢模式 程式 如下 在併發情況下,多個執行緒同時 抵達 if判斷這塊,那麼勢必物件會被多次new。那麼 懶漢模式 下,如何保證併發呢?簡單來說,我們可以在geti...