1. 程式人生 > 其它 >jdk8 List<T> 根據某一個欄位去重

jdk8 List<T> 根據某一個欄位去重

技術標籤:設計模式

單例的定義與特點

單例(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;
    }
}