《Java并发编程实践——第四章(组合对象)》

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 组合

向已有的类中添加一个原子操作,还有更健壮的选择:组合。
在这里插入图片描述
通过使用内部锁,引入了一个新的锁层。

4.5 同步策略的文档化

猜你喜欢

转载自blog.csdn.net/u011067966/article/details/84072084