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

Java中單例模式詳解

 更新時間:2016年11月09日 17:22:32   作者:會飛的小祥  
這篇文章主要介紹了Java中單例模式詳解,單例模式包括了懶漢式單例、餓漢式單例、登記式單例三種,想要了解的朋友可以了解一下。

單例模式概念:

java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。

單例模式有一下特點:

1、單例類只能有一個實例。

2、單例類必須自己自己創(chuàng)建自己的唯一實例。

3、單例類必須給所有其他對象提供這一實例。

單例模式確保某個類只有一個實例,而且自行實例化并向整個系統提供這個實例。在計算機系統中,線程池、緩存、日志對象、對話框、打印機、顯卡的驅動程序對象常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個打印機,但只能有一個Printer Spooler,以避免兩個打印作業(yè)同時輸出到打印機中。每臺計算機可以有若干通信端口,系統應當集中管理這些通信端口,以避免一個通信端口同時被兩個請求同時調用??傊x擇單例模式就是為了避免不一致狀態(tài),避免政出多頭。

首先看一個經典的單例實現。

public class Singleton {
  private static Singleton uniqueInstance = null;
 
  private Singleton() {
    // Exists only to defeat instantiation.
  }
 
  public static Singleton getInstance() {
    if (uniqueInstance == null) {
      uniqueInstance = new Singleton();
    }
    return uniqueInstance;
  }
  // Other methods...
}

Singleton通過將構造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內,Singleton的唯一實例只能通過getInstance()方法訪問。(事實上,通過Java反射機制是能夠實例化構造方法為private的類的,那基本上會使所有的Java單例實現失效。此問題在此處不做討論,姑且掩耳盜鈴地認為反射機制不存在。)

但是以上實現沒有考慮線程安全問題。所謂線程安全是指:如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的?;蛘哒f:一個類或者程序所提供的接口對于線程來說是原子操作或者多個線程之間的切換不會導致該接口的執(zhí)行結果存在二義性,也就是說我們不用考慮同步的問題。顯然以上實現并不滿足線程安全的要求,在并發(fā)環(huán)境下很可能出現多個Singleton實例。

public class TestStream {
   private String name;
   public String getName() {
     return name;
   }
   public void setName(String name) {
     this.name = name;
   } 
   //該類只能有一個實例
   private TestStream(){}  //私有無參構造方法
   //該類必須自行創(chuàng)建
   //有2種方式
   /*private static final TestStream ts=new TestStream();*/
   private static TestStream ts1=null;
   //這個類必須自動向整個系統提供這個實例對象
   public static TestStream getTest(){
     if(ts1==null){
       ts1=new TestStream();
     }
    return ts1;
   }
   public void getInfo(){
     System.out.println("output message "+name);
   }
 }
 public class TestMain {
   public static void main(String [] args){
     TestStream s=TestStream.getTest();
     s.setName("張孝祥");
    System.out.println(s.getName());
     TestStream s1=TestStream.getTest();
     s1.setName("張孝祥");
     System.out.println(s1.getName());
     s.getInfo();
     s1.getInfo();
     if(s==s1){
       System.out.println("創(chuàng)建的是同一個實例");
    }else if(s!=s1){
       System.out.println("創(chuàng)建的不是同一個實例");
     }else{
       System.out.println("application error");
     }
   }
 }

運行結果:

張孝祥
張孝祥
output message 張孝祥
output message 張孝祥
創(chuàng)建的是同一個實例

結論:由結果可以得知單例模式為一個面向對象的應用程序提供了對象惟一的訪問點,不管它實現何種功能,整個應用程序都會同享一個實例對象。

1.餓漢式單例類

//餓漢式單例類.在類初始化時,已經自行實例化 
 public class Singleton1 {
   //私有的默認構造子
   private Singleton1() {}
   //已經自行實例化 
   private static final Singleton1 single = new Singleton1();
   //靜態(tài)工廠方法 
   public static Singleton1 getInstance() {
     return single;
   }
 }

 2.懶漢式單例類

 //懶漢式單例類.在第一次調用的時候實例化 
 public class Singleton2 {
   //私有的默認構造子
   private Singleton2() {}
   //注意,這里沒有final  
   private static Singleton2 single=null;
   //靜態(tài)工廠方法 
   public synchronized static Singleton2 getInstance() {
     if (single == null) { 
       single = new Singleton2();
     } 
    return single;
   }
 }

 3.登記式單例類

 import java.util.HashMap;
 import java.util.Map;
 //登記式單例類.
 //類似Spring里面的方法,將類名注冊,下次從里面直接獲取。
 public class Singleton3 {
   private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();
   static{
     Singleton3 single = new Singleton3();
     map.put(single.getClass().getName(), single);
   }
   //保護的默認構造子
   protected Singleton3(){}
   //靜態(tài)工廠方法,返還此類惟一的實例
   public static Singleton3 getInstance(String name) {
     if(name == null) {
       name = Singleton3.class.getName();
       System.out.println("name == null"+"--->name="+name);
     }
     if(map.get(name) == null) {
       try {
         map.put(name, (Singleton3) Class.forName(name).newInstance());
       } catch (InstantiationException e) {
         e.printStackTrace();
       } catch (IllegalAccessException e) {
         e.printStackTrace();
       } catch (ClassNotFoundException e) {
         e.printStackTrace();
       }
     }
     return map.get(name);
   }
   //一個示意性的商業(yè)方法
   public String about() {  
     return "Hello, I am RegSingleton.";  
   }  
   public static void main(String[] args) {
     Singleton3 single3 = Singleton3.getInstance(null);
    System.out.println(single3.about());
   }
 }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解

    這篇文章主要介紹了Java中l(wèi)ombok的@Builder注解的解析與簡單使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Spring Boot簡介與快速搭建詳細步驟

    Spring Boot簡介與快速搭建詳細步驟

    SpringBoot其本身沒有添加什么新的技術,就是整合了一些現有的框架,并提供了一些默認的配置,就是這些默認的配置,極大的提高了我們的開發(fā)效率。這篇文章主要介紹了Spring Boot簡介與快速搭建,需要的朋友可以參考下
    2021-05-05
  • java Scanner輸入數字、字符串過程解析

    java Scanner輸入數字、字符串過程解析

    這篇文章主要介紹了java Scanner輸入數字、字符串過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java實現本地緩存的方式匯總

    Java實現本地緩存的方式匯總

    引入緩存,主要用于實現系統的高性能,高并發(fā),這篇文章主要介紹了Java實現本地緩存的幾種方式,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java 出現問題javax.servlet.http.HttpServlet was not found解決方法

    java 出現問題javax.servlet.http.HttpServlet was not found解決方法

    這篇文章主要介紹了java 出現問題javax.servlet.http.HttpServlet was not found解決方法的相關資料,需要的朋友可以參考下
    2016-11-11
  • Java中前端傳參含有“+”“=”等特殊字符處理方式

    Java中前端傳參含有“+”“=”等特殊字符處理方式

    這篇文章主要介紹了Java中前端傳參含有“+”“=”等特殊字符處理,比如“+”如果不經過處理,傳到Java后臺之后,就變成空格了,“=”就直接沒了,本文對這一問題給大家詳細講解,需要的朋友可以參考下
    2023-10-10
  • 將Java程序與數據庫進行連接的操作方法

    將Java程序與數據庫進行連接的操作方法

    這篇文章主要介紹了將Java程序與數據庫進行連接的操作方法,是Java入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Java仿Windows記事本源代碼分享

    Java仿Windows記事本源代碼分享

    這篇文章主要為大家詳細介紹了Java仿Windows記事本源代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • java交換排序之雞尾酒排序實現方法

    java交換排序之雞尾酒排序實現方法

    這篇文章主要介紹了java交換排序之雞尾酒排序實現方法,實例分析了排序的原理與相關的實現技巧,需要的朋友可以參考下
    2015-02-02
  • SpringBoot項目集成日志的實現方法

    SpringBoot項目集成日志的實現方法

    這篇文章主要介紹了SpringBoot項目集成日志的實現方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02

最新評論

平乐县| 洪江市| 万宁市| 甘南县| 揭东县| 永寿县| 呼和浩特市| 桐庐县| 都匀市| 长治县| 博野县| 盘锦市| 嫩江县| 穆棱市| 绥化市| 垣曲县| 馆陶县| 玛曲县| 文安县| 浪卡子县| 宁安市| 深水埗区| 台北市| 五指山市| 南昌市| 榆社县| 佛教| 深水埗区| 武穴市| 平武县| 梅河口市| 定襄县| 犍为县| 上高县| 唐山市| 阳朔县| 策勒县| 长岛县| 富裕县| 化州市| 靖远县|