《JAVA併發編程實踐》第四章對象的組合

1.如何寫出一個線程安全的類?

基本要素:
    找出構成對象狀態的所有變量
    找出約束狀態變量的不變性條件(取值範圍 前驗條件或者後驗條件)
    建立對象狀態的併發管理策略

實際中的代碼
訂單類包含自身的狀態和商品的引用
public class Order(){
    private Integer status;
    private Product product;
    public void setStatus(Integer status){
        if(status > 10 || status < 0){
            //做其他處理 
        }
        this.status = status;
    }
    public void setProduct(Product product){
        this.product = product;
    }
    //product的getid是線程不安全的,建立併發管理策略
    public synchronized int getProduct(){
        return product.getId();
    }
}
商品類返回一個id自增的int,getid方法不是一個線程安全
public class Product(){
    private Integer id
    public int getId(){
        return id++;
    }
}

2封裝-實例封閉機制

封裝-實例封閉機制
   將數據封裝在對象內部, 可以將數據的訪問限制在對象的方法上,從而更容易確保線程在訪問數據時持有正確的鎖
裝飾器模式
監視器模式

3委託

如果一個類由多個獨立且線程安全性的狀態變量組成,並且在所有的操作中都不包含無效的狀態轉換,那麼可以將線程安全性委託給底層的狀態變量,而不是這些變量的包裝類。
將線程安全性委託給現有的線程安全類,他是創建線程安全類的一個最有效的策略
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章