91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在java項目中如何實現一個單例模式

發布時間:2020-11-19 16:51:37 來源:億速云 閱讀:197 作者:Leah 欄目:編程語言

在java項目中如何實現一個單例模式?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

java設計模式--單例模式

 單例設計模式

Singleton是一種創建型模式,指某個類采用Singleton模式,則在這個類被創建后,只可能產生一個實例供外部訪問,并且提供一個全局的訪問點。

核心知識點如下:

(1) 將采用單例設計模式的類的構造方法私有化(采用private修飾)。

(2) 在其內部產生該類的實例化對象,并將其封裝成private static類型。

(3) 定義一個靜態方法返回該類的實例。

/** 
 * 方法一
 * 單例模式的實現:餓漢式,線程安全 但效率比較低 
 */ 
public class SingletonTest { 

  // 定義一個私有的構造方法
  private SingletonTest() { 
  } 

  // 將自身的實例對象設置為一個屬性,并加上Static和final修飾符
  private static final SingletonTest instance = new SingletonTest(); 

  // 靜態方法返回該類的實例
  public static SingletonTest getInstancei() { 
    return instance; 
  } 
 
}

方法一就是傳說的中的餓漢模式

優點是:寫起來比較簡單,而且不存在多線程同步問題,避免了synchronized所造成的性能問題;

缺點是:當類SingletonTest被加載的時候,會初始化static的instance,靜態變量被創建并分配內存空間,從這以后,這個static的instance對象便一直占著這段內存(即便你還沒有用到這個實例),當類被卸載時,靜態變量被摧毀,并釋放所占有的內存,因此在某些特定條件下會耗費內存。

/** 
 *方法二
 * 單例模式的實現:飽漢式,非線程安全  
 *  
 */ 
public class SingletonTest {

  // 定義私有構造方法(防止通過 new SingletonTest()去實例化)
  private SingletonTest() {  
  }  

  // 定義一個SingletonTest類型的變量(不初始化,注意這里沒有使用final關鍵字)
  private static SingletonTest instance;  

  // 定義一個靜態的方法(調用時再初始化SingletonTest,但是多線程訪問時,可能造成重復初始化問題)
  public static SingletonTest getInstance() {  
    if (instance == null)  
      instance = new SingletonTest();  
    return instance;  
  }  
} 

方法二就是傳說的中的飽漢模式

優點是:寫起來比較簡單,當類SingletonTest被加載的時候,靜態變量static的instance未被創建并分配內存空間,當getInstance方法第一次被調用時,初始化instance變量,并分配內存,因此在某些特定條件下會節約了內存;

缺點是:并發環境下很可能出現多個SingletonTest實例。

/** 
 *方法三
 * 單例模式的實現:飽漢式,線程安全簡單實現  
 *  
 */ 
public class SingletonTest {

  // 定義私有構造方法(防止通過 new SingletonTest()去實例化)
  private SingletonTest() {  
  }  

  // 定義一個SingletonTest類型的變量(不初始化,注意這里沒有使用final關鍵字)
  private static SingletonTest instance;  

  // 定義一個靜態的方法(調用時再初始化SingletonTest,使用synchronized 避免多線程訪問時,可能造成重的復初始化問題)
  public static synchronized SingletonTest getInstance() {  
    if (instance == null)  
      instance = new SingletonTest();  
    return instance;  
  }  
} 

方法三為方法二的簡單優化

優點是:使用synchronized關鍵字避免多線程訪問時,出現多個SingletonTest實例。

缺點是:同步方法頻繁調用時,效率略低。

/** 
 * 方法四
 * 單例模式最優方案
 * 線程安全 并且效率高 
 * 
 */ 
public class SingletonTest { 

  // 定義一個私有構造方法
  private SingletonTest() { 
   
  }  
  //定義一個靜態私有變量(不初始化,不使用final關鍵字,使用volatile保證了多線程訪問時instance變量的可見性,避免了instance初始化時其他變量屬性還沒賦值完時,被另外線程調用)
  private static volatile SingletonTest instance; 

  //定義一個公有的靜態方法,返回該類型實例
  public static SingletonTest getIstance() { 
    // 對象實例化時與否判斷(不使用同步代碼塊,instance不等于null時,直接返回對象,提高運行效率)
    if (instance == null) {
      //同步代碼塊(對象未初始化時,使用同步代碼塊,保證多線程訪問時對象在第一次創建后,不再重復被創建)
      synchronized (SingletonTest.class) {
        //未初始化,則初始instance變量
        if (instance == null) {
          instance = new SingletonTest();  
        }  
      }  
    }  
    return instance;  
  }  
}

方法四為單例模式的最佳實現。內存占用地,效率高,線程安全,多線程操作原子性。 

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

清水河县| 道真| 扶余县| 阜南县| 临江市| 治县。| 博乐市| 稻城县| 田东县| 唐河县| 兰西县| 乌鲁木齐市| 义马市| 紫云| 白城市| 涞源县| 恩平市| 涞水县| 夏津县| 泸州市| 固阳县| 泰兴市| 扶绥县| 冷水江市| 壤塘县| 景宁| 大丰市| 武宁县| 宜春市| 长丰县| 海林市| 九台市| 吴江市| 紫云| 嵊州市| 朝阳县| 阿荣旗| 三亚市| 名山县| 常德市| 彰武县|