第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Singleton模式序列化問題?

Singleton模式序列化問題?

郎朗坤 2019-04-13 08:45:45
單例實現(xiàn)的一種方式:私有構(gòu)造器,公有靜態(tài)工廠方法publicclassSingleton2{privatestaticfinalSingleton2INSTANCE=newSingleton2();//私有靜態(tài)final域/**私有構(gòu)造器*/privateSingleton2(){}/**公有靜態(tài)工廠方法*/publicstaticSingleton2getInstance(){returnINSTANCE;}}為了使利用這種方法實現(xiàn)的Singleton類變成可序列化的,僅僅在申明中加上“implementsSerializable”是不夠的。為了維護(hù)并保證Singleton,必須聲明所有的實例域都是transient,并提供一個readResolve()方法,否則,每次反序列化一個序列化的實例時都會創(chuàng)建一個新的實例。這段話是effectivejava中的描述,我不理解的是為什么僅僅加上implementsSerializable不行呢,反序列化一個序列化的實例時會創(chuàng)建一個新的實例?--補(bǔ)充問題:關(guān)于這種單例模式有一種評論如下:這種方式基于classloder機(jī)制避免了多線程的同步問題,不過,instance在類裝載時就實例化,雖然導(dǎo)致類裝載的原因有很多種,在單例模式中大多數(shù)都是調(diào)用getInstance方法,但是也不能確定有其他的方式(或者其他的靜態(tài)方法)導(dǎo)致類裝載,這時候初始化instance顯然沒有達(dá)到lazyloading的效果。這里的其他方式還可以是什么?
查看完整描述

2 回答

?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗 獲得超11個贊

1為什么僅僅加上implementsserializable不行
這種方式的單例模式構(gòu)建的基礎(chǔ)是封裝性,如何實現(xiàn)單例呢?由于構(gòu)造函數(shù)變?yōu)榱怂接?,外部無法構(gòu)造,只能通過Singleton2.getInstance()來獲取,這樣實現(xiàn)了單列,但是序列化時是這樣嗎?序列對象如何知道調(diào)用getInstance()來獲取對象呢?我們來看看java底層序列化的實現(xiàn),打開JDK中類ObjectStreamClass(這個類是負(fù)責(zé)序列化類對象的)
privatestaticObjectStreamField[]getSerialFields(Classcl)
throwsInvalidClassException
{
ObjectStreamField[]fields;
if(Serializable.class.isAssignableFrom(cl)&&
!Externalizable.class.isAssignableFrom(cl)&&
!Proxy.isProxyClass(cl)&&
!cl.isInterface())
{
if((fields=getDeclaredSerialFields(cl))==null){
fields=getDefaultSerialFields(cl);
}
Arrays.sort(fields);
}else{
fields=NO_FIELDS;
}
returnfields;
}
再往下跟蹤可以明顯看出他是用反射方式來序列化,用反射方式,不是調(diào)用getinstance(),當(dāng)然單例就失效了
2每次反序列化一個序列化的實例時都會創(chuàng)建一個新的實例
由于反序列化時也是用反射,所有當(dāng)然每一個對象會創(chuàng)建一個新的實例
                            
查看完整回答
反對 回復(fù) 2019-04-13
  • 2 回答
  • 0 關(guān)注
  • 354 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號