隨筆-199  評論-203  文章-11  trackbacks-0

          今天有朋問我java單實例的好處,下面我就單例模式談一下.

          單例模式
          定義:
          Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

          在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。

          還有, singleton能夠被狀態化; 這樣,多個單態類在一起就可以作為一個狀態倉庫一樣向外提供服務,比如,你要論壇中的帖子計數器,每次瀏覽一次需要計數,單態類能否保持住這個計數,并且能synchronize的安全自動加1,如果你要把這個數字永久保存到數據庫,你可以在不修改單態接口的情況下方便的做到。

          另外方面,Singleton也能夠被無狀態化。提供工具性質的功能,

          Singleton模式就為我們提供了這樣實現的可能。使用Singleton的好處還在于可以節省內存,因為它限制了實例的個數,有利于Java垃圾回收(garbage collection)。

          我們常常看到工廠模式中類裝入器(class loader)中也用Singleton模式實現的,因為被裝入的類實際也屬于資源。

          如何使用?
          一般Singleton模式通常有幾種形式:

          public class Singleton {

          private Singleton(){}

          //在自己內部定義自己一個實例,是不是很奇怪?
          //注意這是private 只供內部調用

          private static Singleton instance = new Singleton();

          //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
          public static Singleton getInstance() {
          return instance;
          }
          }

          第二種形式:

          public class Singleton {

          private static Singleton instance = null;

          public static synchronized Singleton getInstance() {

          //這個方法比上面有所改進,不用每次都進行生成對象,只是第一次
          //使用時生成實例,提高了效率!
          if (instance==null)
          instance=new Singleton();
          return instance; }

          }

           


          使用Singleton.getInstance()可以訪問單態類。

          上面第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以后就不用再生成了。

          注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那么使用getInstance()是有可能得到多個Singleton實例。關于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的討論,有興趣者進一步研究。

          一般認為第一種形式要更加安全些。

          使用Singleton注意事項:
          有時在某些情況下,使用Singleton并不能達到Singleton的目的,如有多個Singleton對象同時被不同的類裝入器裝載;在EJB這樣的分布式系統中使用也要注意這種情況,因為EJB是跨服務器,跨JVM的。

          我們以SUN公司的寵物店源碼(Pet Store 1.3.1)的ServiceLocator為例稍微分析一下:

          在Pet Store中ServiceLocator有兩種,一個是EJB目錄下;一個是WEB目錄下,我們檢查這兩個ServiceLocator會發現內容差不多,都是提供EJB的查詢定位服務,可是為什么要分開呢?仔細研究對這兩種ServiceLocator才發現區別:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator屬于資源定位,理所當然應該使用Singleton模式。但是在EJB中,Singleton模式已經失去作用,所以ServiceLocator才分成兩種,一種面向WEB服務的,一種是面向EJB服務的。

          Singleton模式看起來簡單,使用方法也很方便,但是真正用好,是非常不容易,需要對Java的類 線程 內存等概念有相當的了解。

          posted on 2009-07-08 09:03 Werther 閱讀(4374) 評論(2)  編輯  收藏 所屬分類: 10.Java

          評論:
          # re: java單實例的好處 2009-07-09 22:37 | 小人物
          學習了!  回復  更多評論
            
          # re: java單實例的好處[未登錄] 2009-07-22 14:48 | sun
          樓主高見啊  回復  更多評論
            

          I'm reading...

          Java 60

          Head  First SQL

          寶貝連接


          If you need these books,pls send me emails.
          Email:kunpeng.niu@163.com
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          留言簿(10)

          隨筆分類(178)

          隨筆檔案(208)

          文章檔案(1)

          新聞檔案(6)

          相冊

          1.Java Official Website

          2.Java Study Website

          3.Java Technic Website

          4.Java Video Website

          5.Database Website

          6.Bookshop Website

          7.English Website

          8.Friends Link

          9.Other Web

          積分與排名

          • 積分 - 686286
          • 排名 - 67

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 芒康县| 清苑县| 故城县| 重庆市| 类乌齐县| 胶南市| 泾川县| 宁安市| 平果县| 玛纳斯县| 平原县| 思茅市| 玉溪市| 土默特左旗| 新沂市| 抚松县| 宿松县| 堆龙德庆县| 石屏县| 南木林县| 新化县| 宁都县| 昌平区| 梁平县| 休宁县| 彭水| 汝阳县| 辽源市| 英德市| 白沙| 巨野县| 北川| 阿拉善右旗| 琼中| 梨树县| 七台河市| 滨州市| 竹溪县| 内黄县| 封丘县| 怀宁县|