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