最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之單態(tài)模式(Singleton模式)介紹

 更新時(shí)間:2015年03月12日 09:17:10   投稿:junjie  
這篇文章主要介紹了Java設(shè)計(jì)模式之單態(tài)模式(Singleton模式)介紹,本文講解了如何使用單例模式、使用單例模式注意事項(xiàng)等內(nèi)容,需要的朋友可以參考下

定義:Singleton模式主要作用是保證在Java應(yīng)用程序中,一個(gè)類Class只有一個(gè)實(shí)例存在。

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

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

另外方面,Singleton也能夠被無狀態(tài)化。提供工具性質(zhì)的功能,

Singleton模式就為我們提供了這樣實(shí)現(xiàn)的可能。使用Singleton的好處還在于可以節(jié)省內(nèi)存,因?yàn)樗拗屏藢?shí)例的個(gè)數(shù),有利于Java垃圾回收(garbage collection)。

我們常??吹焦S模式中類裝入器(class loader)中也用Singleton模式實(shí)現(xiàn)的,因?yàn)楸谎b入的類實(shí)際也屬于資源。

如何使用單例模式

一般Singleton模式通常有幾種形式:

復(fù)制代碼 代碼如下:

public class Singleton {
    private Singleton(){}
 //在自己內(nèi)部定義自己一個(gè)實(shí)例,是不是很奇怪?
 //注意這是private 只供內(nèi)部調(diào)用
 private static Singleton instance = new Singleton();
 //這里提供了一個(gè)供外部訪問本class的靜態(tài)方法,可以直接訪問  
 public static Singleton getInstance() {
  return instance;   
 }
}

第二種形式:
復(fù)制代碼 代碼如下:

public class Singleton {
 private static Singleton instance = null;
 public static synchronized Singleton getInstance() {
     //這個(gè)方法比上面有所改進(jìn),不用每次都進(jìn)行生成對(duì)象,只是第一次     
     //使用時(shí)生成實(shí)例,提高了效率!
     if (instance==null)
      instance=new Singleton();
  return instance;
    }
}

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

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

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

一般認(rèn)為第一種形式要更加安全些。

使用單例模式注意事項(xiàng)

有時(shí)在某些情況下,使用Singleton并不能達(dá)到Singleton的目的,如有多個(gè)Singleton對(duì)象同時(shí)被不同的類裝入器裝載;在EJB這樣的分布式系統(tǒng)中使用也要注意這種情況,因?yàn)镋JB是跨服務(wù)器,跨JVM的。

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

在Pet Store中ServiceLocator有兩種,一個(gè)是EJB目錄下;一個(gè)是WEB目錄下,我們檢查這兩個(gè)ServiceLocator會(huì)發(fā)現(xiàn)內(nèi)容差不多,都是提供EJB的查詢定位服務(wù),可是為什么要分開呢?仔細(xì)研究對(duì)這兩種ServiceLocator才發(fā)現(xiàn)區(qū)別:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator屬于資源定位,理所當(dāng)然應(yīng)該使用Singleton模式。但是在EJB中,Singleton模式已經(jīng)失去作用,所以ServiceLocator才分成兩種,一種面向WEB服務(wù)的,一種是面向EJB服務(wù)的。

Singleton模式看起來簡(jiǎn)單,使用方法也很方便,但是真正用好,是非常不容易,需要對(duì)Java的類 線程 內(nèi)存等概念有相當(dāng)?shù)牧私狻?/p>

相關(guān)文章

  • 一問詳解SpringBoot配置文件優(yōu)先級(jí)

    一問詳解SpringBoot配置文件優(yōu)先級(jí)

    在SpringBoot項(xiàng)目當(dāng)中,我們要想配置一個(gè)屬性,可以通過這三種方式當(dāng)中的任意一種來配置都可以,那么優(yōu)先級(jí)怎么算,本文主要介紹了一問詳解SpringBoot配置文件優(yōu)先級(jí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Spring注解@Qualifier的使用&&與@Primary注解的不同

    Spring注解@Qualifier的使用&&與@Primary注解的不同

    今天帶你了解一下Spring框架中的@Qualifier?注解,它解決了哪些問題,以及如何使用它,我們還將了解它與?@Primary?注解的不同之處,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能

    java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能

    這篇文章主要給大家介紹了關(guān)于java工具類實(shí)現(xiàn)文件壓縮zip以及解壓縮功能的相關(guān)資料,文中主要使用使用的是hutool工具類,Hutool是一個(gè)Java工具類庫,由國內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實(shí)用的工具類和工具方法,需要的朋友可以參考下
    2024-02-02
  • java多線程下載實(shí)例詳解

    java多線程下載實(shí)例詳解

    這篇文章主要介紹了java多線程下載,結(jié)合實(shí)例形式詳細(xì)分析了Java多線程文件傳輸?shù)脑砼c多線程下載的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-12-12
  • Mysql中的聚簇索引cluster index解析

    Mysql中的聚簇索引cluster index解析

    這篇文章主要介紹了Mysql中的聚簇索引cluster index解析,聚簇索引是一種數(shù)據(jù)庫索引的類型,它將數(shù)據(jù)行物理上存儲(chǔ)在磁盤上按照索引的順序進(jìn)行排序,聚簇索引可以提高查詢性能,因?yàn)樗梢詼p少磁盤I/O操作,需要的朋友可以參考下
    2023-10-10
  • 把spring boot項(xiàng)目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    把spring boot項(xiàng)目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法)

    這篇文章主要介紹了把spring boot項(xiàng)目發(fā)布tomcat容器(包含發(fā)布到tomcat6的方法),然后在文章給大家提到了如何將Spring Boot項(xiàng)目打包部署到外部Tomcat,需要的朋友參考下吧
    2017-11-11
  • Springboot與vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出方法具體介紹

    Springboot與vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出方法具體介紹

    這篇文章主要介紹了Springboot與vue實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • MyBatis中useGenerateKeys的使用解析

    MyBatis中useGenerateKeys的使用解析

    這篇文章主要介紹了MyBatis中useGenerateKeys的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 5種java排序算法匯總工具類

    5種java排序算法匯總工具類

    這篇文章主要總結(jié)了java的快速排序,希爾排序,插入排序,堆排序,歸并排序五種排序算法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Java NIO原理圖文分析及代碼實(shí)現(xiàn)

    Java NIO原理圖文分析及代碼實(shí)現(xiàn)

    本文主要介紹Java NIO原理的知識(shí),這里整理了詳細(xì)資料及簡(jiǎn)單示例代碼和原理圖,有需要的小伙伴可以參考下
    2016-09-09

最新評(píng)論

海丰县| 西藏| 绍兴市| 龙里县| 连山| 尼勒克县| 开远市| 桦川县| 塔河县| 正镶白旗| 得荣县| 安乡县| 中山市| 宜章县| 大新县| 霞浦县| 旌德县| 温州市| 灵石县| 新疆| 襄垣县| 孟村| 琼海市| 乌兰浩特市| 哈尔滨市| 扬中市| 祁连县| 寿宁县| 荣昌县| 沂源县| 门源| 无为县| 丹棱县| 托克逊县| 翁源县| 西吉县| 祁门县| 双牌县| 兴文县| 古浪县| 苏尼特左旗|