Java併發編程實戰 第4章 對象的組合

4.1 設計線程安全的類

三要素:

  • 找出構成對象狀態的所有變量
  • 找出約束狀態變量的不變性條件
  • 建立對象狀態的併發訪問管理策略

4.1.1 收集同步需求

狀態空間:對象與變量的所有可能取值。狀態空間越小,越容易判斷線程的狀態。final類型的域使用得越多,就越能建華對象可能狀態的分析過程。

4.1.2 依賴狀態的操作

類的不變性條件與後驗條件約束了在對象上有哪些狀態和狀態轉換是有效的。

4.1.3 狀態的所有權

4.2 實例封閉

將數據封裝在對象內部,可以將數據的訪問限制在對象的方法上,從而更容易確保線程在訪問數據時總能持有正確的鎖。
封閉機制更易於構造線程安全的類,因爲當封閉類的狀態時,在分析類的線程安全性時就無須檢查整個程序。

4.2.1 監視器模式

把對象的所有可變狀態都封裝起來,並由對象自己的內置鎖來保護。

4.3 線程安全性的委託

如果一個類是由多個獨立且線程安全的狀態變量組成,並且在所有的操作中都不包含無效狀態轉換,那麼可以將線程安全性委託給底層的狀態變量。
如果一個狀態變量是線程安全的,並且沒有任何不變性條件來約束它的值,在變量的操作上也不存在任何不允許的狀態轉換,那麼就可以安全地發佈這個變量。

4.4 在現有的線程安全類中添加功能

例如:給安全list添加putIfAbsent方法
1、直接extend擴展源碼會改變同步策略
public class BetterVector extends Vector {
public synchronized boolean putIfAbsent(E x) {
}
}
2、客戶端加鎖同樣會破壞同步策略的封裝性
public class ListHelper {
public List list = Collections.synchronizedList(new ArrayList());
public boolean putIfAbsent(E x) {
synchronized (list) {

    }
}

}
3、組合
public class ImprovedList implements List {
private final List list;
public ImprovedList(List list) {
this.list = list;
}
public synchronized boolean putIfAbsent(T x) {
}

@Override
public synchronized void clear() {
    list.clear();
}

}
ImprovedList通過自身的內置鎖增加了一層額外的加鎖,可能導致性能損失,但是更健壯。這也是Java監視器模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章