国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java設計模式之單例模式

java設計模式之單例模式

2021-01-21 13:22WAUANG Java教程

這篇文章主要為大家詳細介紹了java設計模式之單例模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下

單例模式也叫做單肩模式,也是一種創建型模式,是我們日常開發中最常使用的一種設計模式,經常被用來封裝一些工具類,例如數據庫連接等。

單例模式的定義:

單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例

單例模式分為以下幾種:
①餓漢單例模式
②懶漢單例模式
③IoDH單例模式
④枚舉單例模式

下面我們一一的進行介紹:

1.首先是餓漢單例模式,顧名思義“餓漢”,代表急著“吃飯”(這里的飯應該是指的實例對象),所以很早就創建出來。不多說,上代碼:

java" id="highlighter_940223">
?
1
2
3
4
5
6
7
8
9
10
11
package singleton;
 
public class HungrySingletonP {
  private static HungrySingletonP instance=new HungrySingletonP();
 
  public HungrySingletonP(){}
 
  public static HungrySingletonP getInstance(){
    return instance;
  }
}

這段代碼很形象的體現了餓漢模式。

這種方法在類加載的時候就已經實例化了(只創建唯一的實例),所以不存在線程上的一些問題。但是,也因為如此如果有太多的單例,且這些實例不經常使用那么久會造成對內存的浪費。

2.懶漢模式,同樣什么叫做懶漢模式?一個懶惰的人,只有去吃飯的時候才會去刷碗(昨天用過的臟碗),即:只有當用到對象的時候才去創建對象,來上代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package singleton;
 
public class LasySingletonV1 {
  private static LasySingletonV1 instance;
 
  public LasySingletonV1(){}
 
  public static LasySingletonV1 getInstance(){
    if(instance==null){
      return new LasySingletonV1();
    }else
      return instance;
  }
}

上面的這段代碼是懶漢模式,當我們不需要實例的時候,它不會創建實例,只有需要實例的時候,才會創建,節省空間。
但是,我們不推薦使用,因為我們原來的設計理念是:當需要的時候(并且instance為空)創建實例,當已經創建過后,如果還需要實例,則判斷instance是否為空,因為前邊已經創建過了,不為空,所以直接返回之前已經創建的實例。
以上的想法是很好的,但是它是線程不安全的。因為:當有多個線程同時調用這個方法時,因為同時判斷實例為空,所以會創建很多個實例,這不符合單例模式的設計理念(一個類只有一個實例對象)。

所以我們需要對它進行改進,因為它會異步創建多個實例,多以我們很容易就能想到,在getInstance方法之前加上synchronized進行同步:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package singleton;
 
public class LasySingletonV2 {
  private static LasySingletonV2 instance;
 
  public LasySingletonV2(){}
 
  public synchronized LasySingletonV2 getInstance(){
 
    if(instance==null){
      return new LasySingletonV2();
    }else
      return instance;
  }
}

上面這樣,就不會創建多個實例對象符合單例模式的概念。

但是上面這樣的設計使得我們每次需要目標實例的時候都要排隊等待,假設有很多線程都在調用這個getInstance方法,那么就會陷入很長時間的等待,大大降低的程序的效率。

所以我們還要對程序進行一定的修改,如果我們創建一個

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package singleton;
 
public class LasySingletonV3 {
  private static LasySingletonV1 instance;
 
  public LasySingletonV3(){}
 
  public LasySingletonV3 getInstance(){
    if(instance==null){
      synchronized(LasySingletonV3.class){
        if(instance==null){
          return new LasySingletonV3();
        }
      }
    }
    return instance;
  }
}

以上的方法是懶漢模式的完整版本,我們來仔細分析一下:

當有多個線程第一次調用這個方法的時候,都滿足instance為空,來到下一步,先獲得鎖的線程進入下一步繼續判斷是否為空,為空,然后創建實例返回實例。

沒有獲得鎖的線程一直等待到獲得鎖的線程釋放鎖,當在等待的線程獲得鎖的時候進入下一步,還要進行判斷instance是否為空,但是這個時候instance已經不為空了,因為前面的線程已經創建了實例,所以返回已經創建好的實例。

以上是第一批調用getInstance方法的線程,當后續的線程調用這個方法的時候就不用進行鎖的獲取了和釋放了,因為第一步已經判斷instance不為空,直接返回instance實例。

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

原文鏈接:http://blog.csdn.net/qq_39266910/article/details/78269431

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美黄色一区 | 中文字幕免费视频 | 久久久久一区二区三区 | 韩国久久 | 好看的国产精彩视频 | 久久久久久免费精品 | 久热国产视频 | 国产在线第一页 | 黄色免费视频 | 一区二区三区欧美在线 | 黄色影片免费观看 | 人人人人人你人人人人人 | 一区二区三区在线观看视频 | 看av的网址 | 亚洲区视频 | www.久久久.com | 欧美成人激情 | 一级一片在线播放在线观看 | 99成人 | 日韩av免费在线播放 | 亚洲精品久久久蜜桃 | 一特黄a大片免费视频 视频 | 一级爱| 国产一区视频在线 | 99久久婷婷国产综合精品电影 | 亚洲高清视频在线 | 精品美女 | 久久久国产精品入口麻豆 | 久久懂色精品99综一区合 | 中文字幕高清av | 国产精品视频一二三区 | 亚洲成人精品在线 | 狠狠操操 | 国产日韩精品视频 | 国产精品成人在线观看 | 蜜桃视频网站在线观看 | 亚洲免费影院 | 天天摸天天摸 | 视频国产一区 | 久久中文字幕一区 | 欧美不卡 |