首页 > 代码库 > 设计线程安全的类
设计线程安全的类
步骤:
找出构成对象状态的所有变量
找出约束状态变量的不变性条件
建立对象状态的并发访问策略
1.在现有的线程安全类中添加功能
(1)重用能减低工作量和提高正确性
(2)如果底层的类改变了同步策略,使用不同的锁来保护它的状态,则子类会被破坏
class BetterVector<E> extends Vector<E>{ public synchronized boolean putIfAbsent(E e){ boolean absent = !contains(e); if(absent){ add(e); } return absent; }}
2.客户端加锁机制
(1)对于使用对象X的客户端,如果知道X使用的是什么锁,则使用X本身用于保护其状态的锁,来保护这段客户端代码
(2)同样会破坏同步策略的封装
A.错误示例:
class ListHelper<E>{ public List<E> list = Collections.synchronizedList(new ArrayList<E>()); public synchronized boolean putIfAbsent(E e){ boolean absent = !list.contains(e); if(absent){ list.add(e); } return absent; }}
B.正确示例:
class ListHelper<E>{ public List<E> list = Collections.synchronizedList(new ArrayList<E>()); public boolean putIfAbsent(E e){ synchronized(list){ boolean absent = !list.contains(e); if(absent){ list.add(e); } return absent; } }}
3.组合:推荐方式
class ImprovedList<E> implements List<E>{
private final List<E> list;
public ImprovedList(List<E> list){ this.list = list; } public synchronized boolean putIfAbsent(E e){ boolean absent = !list.contains(e); if(absent){ list.add(e); } return absent; } public synchronized boolean add(E e) { //委托..... }}
设计线程安全的类
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。