激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 單例模式 分析代碼優化方法

單例模式 分析代碼優化方法

2019-12-15 14:52Cream.icend JAVA教程

這篇文章主要介紹了單例模式 分析代碼優化方法,需要的朋友可以參考下

單例模式是23種設計模式之一,是比較簡單的一種設計模式,它的目的是無論調用多少次,都返回同一個對象,它的特點是構造器私有化。

  它分為兩種結構,一種是懶漢式的,一種是餓漢式的,它們各有優缺點,我們先從餓漢式看起,代碼如下:

?
1
2
3
4
5
6
7
8
public class Single {
  private static Single single = new Single(); 
  private Single() { 
  }
   public Single getInstance() {
    return single;
  
}

通過上面的程序可以看出來雖然我們加載同一個對象的目的確實達到了,但當程序被加載的時候就會創建single這個對象,當這個類有多個這樣的方法時,我們可能會用不到這個對象中大多數單例,就會造成對內存的浪費。所以就出現了懶漢式的單例模式,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Single {
  private static Single single = null
  private Single() { 
  }
 
  public Single getInstance() {
    if(single==null){
      single = new Single();
    }
    return single;
  
}

這樣,只有當我們真正調用這個對象時它才會被new出來,但是這樣是存在問題的。

  當上面的第二段代碼在第一次加載的時候有兩個線程對其進行了調用,則會產生兩個不同的對象,所以是線程不安全的,這時候就會想到給這個方法加個鎖,加鎖之后的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Single {
  private static Single single = null
  private Single() { 
  }
 
  public synchronized Single getInstance() {
    if (single == null) {
      single = new Single();
    }
    return single;
  
}

這樣做確實做到了線程安全,但是當加鎖這個方法里面要執行很多東西,調用這個方法花費的時間會很長,這樣對服務器來說是致命的,因為這個方法如果某個線程一直調用的話,其它的線程是沒有辦法調的,服務器就阻塞了,那么升級后的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Single {
  priate static Single single = null
  private Single() { 
  }
 
  public Single getInstance() {
    if (single == null) {
      synchronized (Single.class) {
        single = new Single();
      }
    }
    return single;
  }
}

仔細觀察以后發現這樣并沒有鎖住,當第一次同時有兩個線程到達getInstance()方法if判斷時,其中有一個肯定是阻塞的,當另外一個執行完以后,阻塞這個線程是不會再判斷是否為空的,還是會創建一個對象的,這樣又有多個對象被產生了,再對其進行升級,得到的代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Single {
  private static Single single = null
  private Single() { 
  }
 
  public Single getInstance() {
    if (single == null) {
      synchronized (Single.class) {
        if (single == null) {
          single = new Single();
        }
      }
    }
    return single;
  }
}

這樣就不會產生上面的問題,而且也只鎖一次,因為第二次再執行這個方法時,會跳過if判斷,直接返回single,不會再被鎖,執行效率也會很高。

  但即使是這樣,也還是有問題的,因為我們不能確定在內存中是先給對象賦值,還是先創建了這個對象,所以第二個程序有可能得到的是初始化一半了的對象,在jdk1.5之后,我們可以用volatile這個關鍵字來避免這種情況,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Single {
  private static volatile Single single = null
  private Single() { 
  }
 
  public Single getInstance() {
    if (single == null) {
      synchronized (Single.class) {
        if (single == null) {
          single = new Single();
        }
      }
    }
    return single;
  }
}

但是這種情況很少使用,我在這里只是為了學習一下,嘻嘻

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产papa | 久久福利在线 | 小情侣嗯啊哦视频www | 毛片在线视频观看 | 久久人人爽爽爽人久久久 | 黄色毛片免费视频 | 亚州成人在线观看 | 久久99精品久久久久久小说 | 精品一区二区三区在线播放 | 美女视频免费一区二区 | 欧洲精品久久久久69精品 | 看免费黄色大片 | 成年免费观看视频 | 午夜精品毛片 | 久久99久久98精品免观看软件 | 欧美久久一区 | 日本在线视频一区二区三区 | 一级做a爰性色毛片免费1 | 欧美成a人片在线观看久 | av性色全交蜜桃成熟时 | 成人一区二区三区在线 | 亚洲精品一区二区三区免 | 91短视频版高清在线观看免费 | 欧美人与禽性xxxxx杂性 | 圆产精品久久久久久久久久久 | 美国av免费看 | 九九热在线免费观看视频 | 激情视频免费看 | 欧美一级高潮片免费的 | 91超视频| 免费观看9x视频网站在线观看 | 久久精品视频黄色 | 久久精品视频首页 | 亚洲精品a在线观看 | 一级毛片a级 | 噜噜噜在线 | 成人免费网站在线观看视频 | 中文字幕欧美日韩 | 深夜福利久久久 | 黑人一区二区三区四区五区 | 久久国产精品91 |