jdk8 List<T> 根據某一個欄位去重
阿新 • • 發佈:2020-12-31
技術標籤:設計模式
單例的定義與特點
單例(Singleton)模式的定義:指一個類只有一個例項,且該類能自動建立這個例項的一種模式。
在計算機系統中,Windows的回收站,作業系統中的檔案系統、多執行緒中的執行緒池、顯示卡的驅動程式物件、印表機的後臺處理服務、應用程式的日誌物件、資料庫的連線池、網站的計數器、Web應用的配置物件,應用程式中的對話方塊、系統中的快取等都屬於單例場景
應用場景
對於Java來說,單例模式可以保證在一個JVM只存在一個單一例項,單例模式的應用場景主要有以下幾個方面。
- 需要頻繁建立的一些類,使用單例可以降低系統的記憶體壓力,減少GC
- 某類只要求生成一個物件的時候,如一個班中的班長,每個人的身份證號。
- 某此類建立例項時佔用資源比較多。或者例項化耗時比較長,且經常使用。
- 某類需要頻繁例項化,而建立物件又頻繁被銷燬的時候,如多執行緒的執行緒池,網路連線池等。
- 頻繁訪問資料庫或檔案的物件
- 對於一些硬體級別的操作,或者從系統上講應當是單一控制邏輯的操作,如果有多個例項,則系統會完全亂套。
- 當物件需要被共享的場景。由於單例模式只允許建立一個物件,共享該物件可以節省記憶體,並加快物件訪問速度。如Web中的配置物件、資料庫的連線池等。
常見的兩種執行緒安全常用建立方法
- 餓式模式
最簡單的就是餓漢模式,是通過私有靜態就是來實現的。在類建立時就已經存在,所以稱之為餓漢模。但是注意,不建議佔用過多記憶體資源的單例物件採用餓漢模式,建議採用懶漢模式
public class Singleton1 {
private static Singleton1 instance = new Singleton1();
public static Singleton1 getInstance() {
return instance;
}
}
- 懶漢模式
懶漢模式就在指在需要時才建立,所以稱之為懶漢模式。雙重校驗鎖和靜態內部類都屬於這種模式,本例使用的是內部靜態類
public class Singleton2 {
//只有靜態類才能擁有靜態成員,普通內部類只能定義普通成員
private static class LazyHolder {
private static final Singleton2 INSTANCE = new Singleton2();
}
public Singleton2 getInstance() {
return LazyHolder.INSTANCE;
}
}
- 雙重校驗鎖
再寫一個雙重校驗鎖的寫法,也是執行緒安全的,再描述下雙重校驗的目的
public class Singleton3 {
//通過volatile 保證可見性和有序性
private volatile static Singleton3 instance;
private Singleton3() {
}
public Singleton3 getInstance() {
if (instance == null) {//先校驗,減少鎖競爭,提升效能
synchronized (Singleton3.class) {
if (instance == null) {//加鎖和判斷instance不是原子性操作,避免多執行緒場景的時間片競爭帶來的單例失效風險
instance = new Singleton3();
}
}
}
return instance;
}
}