單例模式就是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點。
在系統中,有些物件只需要存在乙個,或者說這類物件若存在多個,則有可能導致一些問題,如:資源過量使用、程式行為異常和資料不一致等問題。資料庫連線池、執行緒池等都是這類物件。
節省建立物件的時間,特別是對於那些重量級物件而言。
new操作次數減少,能夠降低系統記憶體的使用頻率,從而減少gc次數,進而縮短gc停頓時間(stop-the-world)
我們知道靜態變數在程式載入了類的位元組碼後就會被分配空間,而不用去建立任何例項物件。如果程式某次執行中一直沒用這個物件,就會造成資源的浪費。而通過單例模式,可以實現在需要的時候才建立物件,這樣就可以避免資源的浪費,同時也使程式更加靈活。
5.1、餓漢式:類載入時構建,執行緒安全
public
class
singleton
private
singleton()
}
5.2、懶漢式:第一次被使用時構建,執行緒不安全public
class
singleton
return ourinstance;
}private
singleton()
}
為什麼是執行緒不安全的?當多個執行緒進入到if語句時,就會建立多個例項,因此是執行緒不安全的。
如果想要執行緒安全,只需要在getinstance()
方法加上synchronized
關鍵字即可,不過會導致執行緒阻塞。
5.3、雙重檢查加鎖
public
class
singleton}}
return ourinstance;
}private
singleton()
}
【擴充套件】上面的synchronized
**塊和synchronized
修飾在方法上有什麼區別?可以直接修飾在方法上嗎?
【擴充套件】第一行和第二行if (ourinstance == null)
的作用分別是什麼?可以只用一行嗎?
【擴充套件】volatile
關鍵字的作用是什麼?
5.4、內部靜態類
public
class
singleton
public
static singleton getinstance()
private
singleton()
}
在沒有呼叫 getinstance() 方法之前,靜態內部類不會進行初始化,在第一次呼叫該方法後就生成了唯一乙個例項。
5.5、列舉方式:執行緒安全,防止反射攻擊問題和序列化問題
public
enum enumsingleton
}
【擴充套件】為什麼說列舉方式的單例能夠防止反射攻擊和序列化問題? 設計模式 單例模式
單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...
設計模式 單例模式
class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...
設計模式 單例模式
單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...