單例實現(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的效果。這里的其他方式還可以是什么?
Singleton模式序列化問題?
郎朗坤
2019-04-13 08:45:45