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委托
如果一个类由多个独立且线程安全性的状态变量组成,并且在所有的操作中都不包含无效的状态转换,那么可以将线程安全性委托给底层的状态变量,而不是这些变量的包装类。
将线程安全性委托给现有的线程安全类,他是创建线程安全类的一个最有效的策略