版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011067966/article/details/84072084
组合对象
我们不希望为了获得线程安全而去每次分析内存访问;而希望线程安全的组件能够以安全的方式组合成更大的组件或程序。
4.1 设计线程安全的类
4.1.1 收集同步需求
4.1.2 状态依赖的操作
4.1.3 状态所有权
4.2 实例限制
即使一个对象不是线程安全的,你也可以让他安全地用于多线程。
比如确保它只被单一的线程访问,也可确保所有的访问都正确地被锁保护。
实例限制是构建线程安全类的最简单方法之一。
4.2.1 Java监视器模式
对象封装所有的可变状态,并由自己的内部锁保护。
4.2.2 范例:机动车追踪器
先复制数据,再返回给用户,这种实现方式部分地维护这线程安全。
4.3 委托线程安全
把线程的安全性委托给线程安全的类,就是委托线程安全。
4.3.2 非状态依赖变量
4.3.3 当委托无法胜任时
状态变量lower和upper不是彼此独立的,不能将安全性委托个线程安全的状态变量上。
扫描二维码关注公众号,回复:
4105346 查看本文章
4.3.4 发布底层的状态变量
4.4 向已有的线程安全类添加功能
直接向类中加入新方法,意味着所有实现类同步策略仍然包含在一个源代码文件中,便于理解和维护。但是通常不可能,无法操作原始类。
另一个方法是扩展类,可能会改变父类的同步策略。
4.4.1 客户端加锁
list操作声明了synchronized,但是使用了不同的锁,将意味着putIfAbsent对list的其他操作而言,并不是原子化。
正确的方法是使用相同的锁:
4.4.2 组合
向已有的类中添加一个原子操作,还有更健壮的选择:组合。
通过使用内部锁,引入了一个新的锁层。