我們知道String的不變性,讓它可以在多線程狀態下發揮高性能的優勢,那我們是否可以將一個類設置爲不變屬性,讓它也可以在多線程下發揮高性能呢?當然可以
前提條件
只有當這個類滿足以下前提,才能設置爲不變模式
- 當對象創建後,其內部狀態和數據不能發生任何變化
- 數據需要被多線程共享、頻繁訪問
設置方法
- 不能有修改自身屬性的方法,比如setter
- 將所有屬性設置爲私有,並且用final標記
- 將類設置爲final,確保子類不能繼承
- 有一個可以創建完整對象的構造函數
例子
public final class Product {
private final String no;
private final String name;
private final double price;
public Product(String no, String name, double price) {
super();
this.no = no;
this.name = name;
this.price = price;
}
public String getNo() {
return no;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
總結
好了,只要滿足上面的條件,這個類就可以當做“不變”的類了,JDK中7個基礎類型對應的包裝類和String都使用了不變模式,不變模式可以提高系統的併發性能和併發量