單例模式
用于保證一個類只有一個實例,并提供全局訪問點。在安卓開發(fā)中,可以用單例來實現(xiàn)不同Activity之間共享數(shù)據(jù),比如某自定義類的集合。
【懶漢式】
調(diào)用get方法時才完成實例化。
【餓漢式】
程序啟動時就立即創(chuàng)建該單例對象。不需要考慮線程安全問題。
【破壞單例模式】
1.通過Singleton.class獲取Singleton類的Class對象,然后使用getDeclaredConstructor()方法獲取Singleton類的構(gòu)造方法,再通過setAccessible(true)方法將構(gòu)造方法的訪問權(quán)限設(shè)置為可訪問,最后使用newInstance()方法創(chuàng)建Singleton對象。
解決方法:加對象鎖或者同步鎖都可以。
2.當(dāng)一個單例對象被序列化后,如果在反序列化過程中沒有特殊處理,會通過調(diào)用類的構(gòu)造方法來創(chuàng)建對象,那么系統(tǒng)會重新創(chuàng)建一個新的對象,從而導(dǎo)致原有的單例對象被破壞。單例模式的構(gòu)造方法通常被私有化,從而不能直接被外部調(diào)用。因此,如果沒有特殊處理,系統(tǒng)會使用默認的構(gòu)造方法來創(chuàng)建一個新的對象。
如下方式可以解決。在反序列化時會返回已經(jīng)創(chuàng)建好的單例實例,而不會再創(chuàng)建新的實例。
標(biāo)簽: