單例模式加鎖優化問題

2021-07-15 09:46:47 字數 1658 閱讀 3172

單例模式特點:

單例模式應用場景:

單例模式型別:

優點:一開始就建立例項,執行緒安全

缺點:佔記憶體,耗資源

public class singleton 

//建立公有靜態例項

public static singleton getinstance()

優點:呼叫例項靜態方法時,沒有建立例項,再建立;合理利用資源,減少資源浪費

缺點:可能會引起執行緒衝突,不安全

public class singleton 

//建立公有靜態例項

public static singleton getinstance()

return uniqueinstance;

}

public class singleton 

//建立公有靜態例項,注意在例項方法前加了synchronized

public synchronized static singleton getinstance()

return uniqueinstance;

}

但是這樣每個進來的執行緒都加鎖後再判斷例項是否已經存在,然而加鎖的次數越多,**執行效能越慢,所以為了減少不必要的加鎖次數,進行再次優化。

優化2:減少加鎖次數

public class singleton 

//建立公有靜態例項,注意在例項方法前加了synchronized

public static singleton getinstance() }}

return uniqueinstance;

}

二次優化後,當例項已經存在的時候就直接返回例項,提高了**執行效能,且執行緒安全。

登記式單例模式用的不多,它主要是對一組單例模式進行的維護,主要是在數量上的擴充套件

通過map我們把單例存進去,這樣在呼叫時,先判斷該單例是否已經建立,是的話直接返回,不是的話建立乙個登記到map中,再返回。對於數量又分為固定數量和不固定數量的。下面採用的是不固定數量的方式,在getinstance方法中加上引數(string name)。然後通過子類繼承,重寫這個方法將name傳進去。讓我們看看**吧。(引用

public class singleton3 

//protected型別的預設構造子

protected singleton3(){}

//靜態工廠方法,返還此類惟一的例項

public static singleton3 getinstance(string name)

if(map.get(name) == null) catch (instantiationexception e) catch (illegalacces***ception e) catch (classnotfoundexception e)

}return map.get(name);

} ....

}

單例模式多執行緒 加鎖

單例模式的多執行緒 比如使用者點選 程式正在操作這條資料的過程中 然後又有乙個人點選 又把這條資料修改了 多執行緒會發生的問題 這時候 當第乙個使用者點選後 應該給這個方法上鎖 通常new乙個object物件 把執行的 放到lock中 lock裡面的方法塊只有乙個執行緒可以進入 第二個執行緒需要等待...

單例模式加鎖與不加鎖例項C

1 教科書裡的單例模式 我們都很清楚乙個簡單的單例模式該怎樣去實現 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。上 12 3 4 5 6 7 ...

優化單例模式

單例模式 用於產生物件的具體例項,可以確保系統中乙個類只產生乙個例項。好處是,省略建立物件所花費的時間 減少系統記憶體的使用率,降低gc壓力,縮短gc停頓時間。餓漢模式 public class singleton private static singleton instance new sing...