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委託
如果一個類由多個獨立且線程安全性的狀態變量組成,並且在所有的操作中都不包含無效的狀態轉換,那麼可以將線程安全性委託給底層的狀態變量,而不是這些變量的包裝類。
將線程安全性委託給現有的線程安全類,他是創建線程安全類的一個最有效的策略