熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java程序性能優化-單例模式(3)

2013-11-23 20:01:42  來源: Java高級技術 

    單例模式(

  通常情況下用以上方式實現的單例已經可以確保在系統中只存在唯一實例了但仍然有例外情況可能導致系統生成多個實例比如在代碼中通過反射機制強行調用單例類的私有構造函數生成多個單例考慮到情況的特殊性本書中不對這種極端的方式進行討論但仍有些合法的方法可能導致系統出現多個單例類的實例

  一個可以被串行化的單例

  public class SerSingleton implements javaioSerializable{

  String name;

  private SerSingleton() {

  Systemoutprintln(Singleton is create

  //創建單例的過程可能會比較慢

  name=SerSingleton;

  }

  private static SerSingleton instance = new SerSingleton()

  public static SerSingleton getInstance() {

  return instance;

  }

  public static void createString(){

  Systemoutprintln(createString in Singleton

  }

  private Object readResolve(){       //阻止生成新的實例總是返回當前對象

  return instance;

  }

  }

  測試代碼如下

  @Test

  public void test() throws Exception {

  SerSingleton s = null;

  SerSingleton s = SerSingletongetInstance()

  //先將實例串行化到文件

  FileOutputStream fos = new FileOutputStream(SerSingletontxt

  ObjectOutputStream oos = new ObjectOutputStream(fos)

  ooswriteObject(s)

  oosflush()

  oosclose()

  //從文件讀出原有的單例類

  FileInputStream fis = new FileInputStream(SerSingletontxt

  ObjectInputStream ois = new ObjectInputStream(fis)

  s = (SerSingleton) oisreadObject()

  AssertassertEquals(s s

  }

  使用一段測試代碼測試單例的串行化和反串行化當去掉SerSingleton代碼中加粗的readReslove()函數時以下測試代碼拋出異常

  junitframeworkAssertionFailedError: expected:javatuningchsingleton

  serializationSerSingleton@ee

  but was:javatuningchsingletonserializationSerSingleton@fec

  說明測試代碼中s和s指向了不同的實例在反序列化後生成多個對象實例而加上readReslove()函數的程序正常退出說明即便經過反序列化仍然保持了單例的特征事實上在實現了私有的readReslove()方法後readObject()已經形同虛設它直接使用readReslove()替換了原本的返回值從而在形式上構造了單例

  注意序列化和反序列化可能會破壞單例一般來說對單例進行序列化和反序列化的場景並不多見但如果存在就要多加注意

       返回目錄Java程序性能優化讓你的Java程序更快更穩定

  編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

       JME移動開發實戰教學視頻

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27835.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.