程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java設計優化之單例形式

java設計優化之單例形式

編輯:關於JAVA

java設計優化之單例形式。本站提示廣大學習愛好者:(java設計優化之單例形式)文章只能為提供參考,不一定能成為您想要的結果。以下是java設計優化之單例形式正文


單例形式是一種對象創立形式,確保體系中一個類只要一個實例。

在java說話中,如許做有兩年夜利益:

1.關於頻仍應用的對象,可以省略創立對象所話費的時光;

2.因為new操作的次數削減,關於體系內存的應用頻率下降,如許削減GC的壓力,延長GC停留的時光。

單例形式細分:

1.

public class Singleton{
  private Singleton(){
    System.out.println("Singleton.Singleton()");
  }
  
  private static Singleton singleton = new Singleton();
  
  public static Singleton getInstance(){
    return singleton;
  }
}

留意:起首單例類必需有一個private拜訪級其余結構函數,確保單例不會被體系其他代碼實例化;其次,singleton成員變量和getInstance()辦法必需是static的。

這個單例類創立非常簡略,並且異常靠得住。獨一的缺陷是沒法對singleton做延遲加載,例如因為單例創立進程很慢,因為成員變量界說為static,在jvm加載單例類時,單例對象也會被創立,那末在任何用到單例類的處所都邑創立單例對象,不論單例對象能否被用到。例如:

public class Singleton{
  private Singleton(){
    System.out.println("Singleton.Singleton()");
  }
  
  private static Singleton singleton = new Singleton();
  
  public static Singleton getInstance(){
    return singleton;
  }
  
  public static void createString(){
    System.out.println("Singleton.createString()");
  }
}

2.為了進步相干函數的挪用速度,就須要引入懶加載機制。

package com.luchao.singtonle;

public class LazySingleton {
  private LazySingleton() {
    System.out.println("LazySingleton.LazySingleton()");
  }
  private static LazySingleton lazyInstance = null;
  
  public synchronized static LazySingleton getInstance(){
    if(lazyInstance==null)
      lazyInstance = new LazySingleton();
    return lazyInstance;
  }
}

關於靜態變量singleton初始化賦值為null,確保體系啟動時沒有額定的負荷。在getInstance()辦法中,斷定以後實例非常曾經存在,假如存在則前往,假如不存在,再建單例。getInstance()必需為同步辦法,由於在多線程情況下,當線程1正在建單例,未完成賦值前,線程2能夠斷定instance為null,故線程2將啟動樹立新建單例的法式,招致多個單例被創立。

下面實例單例完成,固然完成了延遲加載,然則引入了同步辦法,在多線程情況下,耗時弘遠於第一個單例法式。

3.單例形式應用外部類來保護單例的創立

public class StaticSingleton {
  private StaticSingleton() {
    System.out.println("StaticSingleton.StaticSingleton()");
  }
  
  private static class SingletonHolder{
    private static StaticSingleton ataticSingleton = new     StaticSingleton();
  } 
  
  public static StaticSingleton getInstance(){
    return SingletonHolder.ataticSingleton;
  }
  
}

StaticSingleton被加載時,外部類不會被實例化,確保StaticSingleton類被載入jvm時,不會被初始化單例類,而當getInstance()辦法被挪用時,才加載SingletonHolder,從而初始化instance。同時用於實例的樹立在類加載時完成,故生成對線程友愛。

應用外部類完成單利形式,既可以做到延遲加載,也不消應用同步症結字,是一種比擬完美的做法。

以上就是本文的全體內容願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved