單例與多執行緒

2021-08-28 05:57:11 字數 1140 閱讀 9758

單例的兩種實現:

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...