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

單例模式 分析代碼優(yōu)化方法

 更新時間:2015年04月08日 22:44:30   作者:Cream.icend  
這篇文章主要介紹了單例模式 分析代碼優(yōu)化方法,需要的朋友可以參考下

單例模式是23種設計模式之一,是比較簡單的一種設計模式,它的目的是無論調(diào)用多少次,都返回同一個對象,它的特點是構造器私有化。

  它分為兩種結構,一種是懶漢式的,一種是餓漢式的,它們各有優(yōu)缺點,我們先從餓漢式看起,代碼如下:

public class Single { 
  private static Single single = new Single();  
  private Single() {  
  } 
   public Single getInstance() { 
    return single; 
  }  
}

通過上面的程序可以看出來雖然我們加載同一個對象的目的確實達到了,但當程序被加載的時候就會創(chuàng)建single這個對象,當這個類有多個這樣的方法時,我們可能會用不到這個對象中大多數(shù)單例,就會造成對內(nèi)存的浪費。所以就出現(xiàn)了懶漢式的單例模式,代碼如下:

public class Single { 
  private static Single single = null;  
  private Single() {  
  } 
 
  public Single getInstance() { 
    if(single==null){ 
      single = new Single(); 
    } 
    return single; 
  }  
}

這樣,只有當我們真正調(diào)用這個對象時它才會被new出來,但是這樣是存在問題的。

  當上面的第二段代碼在第一次加載的時候有兩個線程對其進行了調(diào)用,則會產(chǎn)生兩個不同的對象,所以是線程不安全的,這時候就會想到給這個方法加個鎖,加鎖之后的代碼如下:

public class Single { 
  private static Single single = null;  
  private Single() {  
  } 
 
  public synchronized Single getInstance() { 
    if (single == null) { 
      single = new Single(); 
    } 
    return single; 
  }  
}

這樣做確實做到了線程安全,但是當加鎖這個方法里面要執(zhí)行很多東西,調(diào)用這個方法花費的時間會很長,這樣對服務器來說是致命的,因為這個方法如果某個線程一直調(diào)用的話,其它的線程是沒有辦法調(diào)的,服務器就阻塞了,那么升級后的代碼如下:

public class Single { 
  priate static Single single = null;  
  private Single() {  
  } 
 
  public Single getInstance() { 
    if (single == null) { 
      synchronized (Single.class) { 
        single = new Single(); 
      } 
    } 
    return single; 
  } 
}

仔細觀察以后發(fā)現(xiàn)這樣并沒有鎖住,當?shù)谝淮瓮瑫r有兩個線程到達getInstance()方法if判斷時,其中有一個肯定是阻塞的,當另外一個執(zhí)行完以后,阻塞這個線程是不會再判斷是否為空的,還是會創(chuàng)建一個對象的,這樣又有多個對象被產(chǎn)生了,再對其進行升級,得到的代碼如下:

public class Single { 
  private static Single single = null;  
  private Single() {  
  } 
 
  public Single getInstance() { 
    if (single == null) { 
      synchronized (Single.class) { 
        if (single == null) { 
          single = new Single(); 
        } 
      } 
    } 
    return single; 
  } 
}

這樣就不會產(chǎn)生上面的問題,而且也只鎖一次,因為第二次再執(zhí)行這個方法時,會跳過if判斷,直接返回single,不會再被鎖,執(zhí)行效率也會很高。

  但即使是這樣,也還是有問題的,因為我們不能確定在內(nèi)存中是先給對象賦值,還是先創(chuàng)建了這個對象,所以第二個程序有可能得到的是初始化一半了的對象,在jdk1.5之后,我們可以用volatile這個關鍵字來避免這種情況,代碼如下:

public class Single { 
  private static volatile Single single = null;  
  private Single() {  
  } 
 
  public Single getInstance() { 
    if (single == null) { 
      synchronized (Single.class) { 
        if (single == null) { 
          single = new Single(); 
        } 
      } 
    } 
    return single; 
  } 
}

但是這種情況很少使用,我在這里只是為了學習一下,嘻嘻

相關文章

  • Java Socket實現(xiàn)傳輸壓縮對象的方法示例

    Java Socket實現(xiàn)傳輸壓縮對象的方法示例

    這篇文章主要介紹了Java Socket實現(xiàn)傳輸壓縮對象的方法,結合具體實例形式分析了java socket針對數(shù)據(jù)的壓縮、傳輸、接收、解壓縮等操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • Java中CAS機制實現(xiàn)方法詳解

    Java中CAS機制實現(xiàn)方法詳解

    傳統(tǒng)的并發(fā)控制手段如synchronized和ReentrantLock雖有效防止資源競爭,卻可能引起性能開銷,相比之下,CAS(CompareAndSwap)提供一種輕量級的樂觀鎖策略,通過硬件級別的原子指令實現(xiàn)無鎖并發(fā),提高性能,需要的朋友可以參考下
    2024-09-09
  • 基于IDEA創(chuàng)建SpringMVC項目流程圖解

    基于IDEA創(chuàng)建SpringMVC項目流程圖解

    這篇文章主要介紹了基于IDEA創(chuàng)建SpringMVC項目流程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java線程同步、同步方法實例詳解

    Java線程同步、同步方法實例詳解

    本篇文章主要通過實例介紹了Java線程:線程的同步-同步方法,需要的朋友可以參考下
    2017-04-04
  • JSP、Servlet中get請求和post請求的區(qū)別總結

    JSP、Servlet中get請求和post請求的區(qū)別總結

    這篇文章主要介紹了JSP、Servlet中get請求和post請求的區(qū)別總結,列舉了多條不同點,需要的朋友可以參考下
    2014-07-07
  • IDEA 程序包不存在,找不到符號但是明明存在對應的jar包(問題分析及解決方案)

    IDEA 程序包不存在,找不到符號但是明明存在對應的jar包(問題分析及解決方案)

    這篇文章主要介紹了IDEA 程序包不存在,找不到符號但是明明存在對應的jar包 的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring Security基于數(shù)據(jù)庫實現(xiàn)認證過程解析

    Spring Security基于數(shù)據(jù)庫實現(xiàn)認證過程解析

    這篇文章主要介紹了Spring Security基于數(shù)據(jù)庫實現(xiàn)認證過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Idea如何自定義VM配置

    Idea如何自定義VM配置

    這篇文章主要介紹了Idea如何自定義VM配置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 在Java中關閉SQL執(zhí)行日志來優(yōu)化服務器性能

    在Java中關閉SQL執(zhí)行日志來優(yōu)化服務器性能

    Java應用程序中,數(shù)據(jù)庫操作是一個常見的任務,如果不適當?shù)靥幚鞸QL執(zhí)行日志,可能會導致不必要的性能損失,SQL執(zhí)行日志通常由數(shù)據(jù)庫連接池、ORM框架(如Hibernate、MyBatis)、或者應用服務器的內(nèi)置日志機制生成,本文將探討如何在Java中關閉SQL執(zhí)行日志,提升應用性能和效率
    2024-11-11
  • 使用開源項目JAVAE2 進行視頻格式轉換

    使用開源項目JAVAE2 進行視頻格式轉換

    這篇文章主要介紹了使用開源項目JAVAE 進行視頻格式轉換,幫助大家更好的利用Java處理視頻,完成自身需求,感興趣的朋友可以了解下
    2020-11-11

最新評論

同心县| 临武县| 特克斯县| 阿荣旗| 建湖县| 赣榆县| 海伦市| 子长县| 洪洞县| 鲜城| 梓潼县| 拉萨市| 海晏县| 武川县| 内江市| 息烽县| 铜陵市| 海晏县| 虞城县| 赤城县| 宁远县| 邮箱| 安乡县| 元氏县| 扶绥县| 新绛县| 荆州市| 革吉县| 土默特右旗| 阿合奇县| 罗田县| 哈密市| 池州市| 内江市| 巴青县| 崇礼县| 哈尔滨市| 杨浦区| 临泽县| 静海县| 诏安县|