并发编程中的对象组合的哲学
文章目录
- 引言
- 对象组合与安全委托
- 实例封闭技术
- 基于监视器模式的对象访问
- 对象不可变性简化委托
- 原子维度的访问
- 现有容器的并发安全的封装哲学
- 使用继承
- 使用组合
- 小结
- 参考
引言
本文将介绍通过封装技术,保证开发者不对整个程序进行分析的情况下,就可以明确一个类是否是线程安全的,即一种对象组合的哲学。
对象组合与安全委托
实例封闭技术
利用合适的组合将访问对象封闭,同时使用合适的锁将访问限制,即可确保对象访问时是安全且一致的,就像下面这段代码,我们将map
实例封闭用final保证域的不可变,对外发布的读写操作保证容器的操作一致和安全,注意笔者强调的是容器map
的安全,object
发布出去之后可能在并发操作情况下还是存在线程安全问题,如果对于obj访问需要保证安全,建议用final修饰一下内部的成员字段:
//实例封闭在内部初始化,且不对外发布private final Map<String, Object> map = new HashMap<String, Object>();//读写采用一致维度的锁进行互斥public synchronized void put(String key, Object object) {map.put(key, object);}public synchronized Object get(String key) {return map.get(key);}
基于监视器模式的对象访问
从线程封闭原则及逻辑推论可以得出java监视器模式,对于并发操作下的对象读访问,我们可以采用监视器模式将可变状态封装,整体思路为:
- 将需要管理的实例封闭
- 使用final保证容器安全的初始化
- 封闭实例只读操作
- 屏蔽所有容器的管理操作
- 所有线程的访问仅仅返回拷贝对象
对应的代码如下所示:
//final修饰保证list安全初始化private final List<Person> list ;public Obj(List<Person> list) {//使用不可变方法为容器做好安全兜底this.list = Collections.unmodifiableList(list);}public synchronized void