一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|

服務器之家 - 編程語言 - JAVA教程 - 詳解java 單例模式及方法總結

詳解java 單例模式及方法總結

2020-10-22 17:29super_YC JAVA教程

這篇文章主要介紹了詳解java 單例模式及方法總結的相關資料,需要的朋友可以參考下

java設計模式--單例模式

 單例設計模式

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

核心知識點如下:

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 方法一
 * 單例模式的實現:餓漢式,線程安全 但效率比較低
 */
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對象便一直占著這段內存(即便你還沒有用到這個實例),當類被卸載時,靜態變量被摧毀,并釋放所占有的內存,因此在某些特定條件下會耗費內存。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 *方法二
 * 單例模式的實現:飽漢式,非線程安全 
 
 */
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實例。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 *方法三
 * 單例模式的實現:飽漢式,線程安全簡單實現 
 
 */
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實例。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * 方法四
 * 單例模式最優方案
 * 線程安全 并且效率高
 *
 */
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; 
  
}

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

(事實上,可以通過Java反射機制來實例化private類型的構造方法,此時基本上會使所有的Java單例實現失效。本帖不討論反射情況下問題,默認無反射,也是常見的面試已經應用場景)

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/super_yc/article/details/70141920

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 任我鲁精品视频精品 | 香蕉视频在线观看网站 | 日本高清在线观看天码888 | 欧美综合精品一区二区三区 | 4hc44四虎永久地址链接 | 久久香蕉国产免费天天 | 91精品手机国产在线观 | www.av网站| 九九精品成人免费国产片 | 国产亚洲精品自在线亚洲情侣 | 糖心vlog视频永久破解版 | 久久三级视频 | 小sao货水好多真紧h的视频 | 深夜在线观看网站 | 色屁屁www | 私人影院在线免费观看 | 草啪啪| 成人人免费夜夜视频观看 | 国产视频91在线 | 动漫女性扒开尿口羞羞漫画 | 久久久无码精品亚洲A片软件 | 喘息揉弄1v1h老师 | 午夜亚洲精品久久久久久 | 日本性生活大片 | 爽好舒服使劲添高h视频 | 99视频免费在线 | 国产欧美成人不卡视频 | 日韩a无吗一区二区三区 | 天堂俺去俺来也www久久婷婷 | 欧美视频在线一区二区三区 | 日本一在线中文字幕天堂 | 5151hh四虎国产精品 | 亚洲国产剧情中文视频在线 | 亚洲精品一区二区观看 | 欧美性理论片在线观看片免费 | 国产永久一区二区三区 | 亚洲欧美成人中文在线网站 | 超碰av | 青草青青在线视频观看 | 欧美穿高跟鞋做爰 | 9420高清完整版在线观看国语 |