《Java并发编程实战》第4章-对象的组合

0.概念理解

状态空间 :对象与变量所有可能的取值,状态空间越小,就越容易判断线程的状态,final域用得越多,就越能简化对象可能状态的分析过程(不可变对象只有唯一的状态)。
实例封闭 :将数据封装在对象内部,并且用锁来保护所有访问路径。
Java监视器模式:一种编写代码的约定,把对象的所有可变状态都封装起来,并由对象自己的内置锁来保护,优势在于其简单性(进一步优化可以考虑使用私有锁对象,使得客户代码无法得到锁)。

1.为什么要考虑对象的组合?

因为我们不希望每一次内存访问都进行线程安全性分析,成本太高,而是希望将一些现有的线程安全组件组合为更大规模的线程安全组件或程序。

2.在设计线程安全类的过程中,需要考虑哪3个基本要素?

(1)找出构成对象状态的所有变量(引用其他对象则包含引用对象的域);

(2)找出约束状态变量的不变性条件;

(3)建立对象状态的并发访问管理策略。

3.同步策略的内涵是什么?

(1)定义了如何在不违背对象不变性条件或后验条件的情况下对其状态的访问操作进行协同;

(2)规定了如何将不可变性、线程封闭与加锁机制等结合起来以维护线程的安全性,规定了哪些变量由哪些锁来保护;

(3)要确保开发人员可以对这个类进行分析与维护,同步策略必须被写为正式文档。

4.线程安全性的委托,需要注意些什么?

(1)单个安全的状态变量,可直接委托;

(2)多个彼此独立的安全状态变量,在多个变量上不增加不变性条件,可直接委托;

(3)多个非独立状态变量,需要做到以下2点:

a. 通过加锁机制维护不变性条件;

b. 避免发布状态变量到外部,防止客户代码破坏不变性条件。

(4)把线程安全性委托给某个对象的底层状态变量时,发布这些变量的条件:

a. 变量本身是线程安全的;

b. 没有任何不变性条件来约束它的值;

c. 不存在任何不允许的状态转换。

其他需要注意的问题
  • 跨线程的容器(上下文)对象(例如ServletContext)必须是线程安全的;
  • 使用实例封闭机制时,需要注意不要将对象发布到超出既定的作用域,不要使对象逸出;
  • 不可变的值可以被自由地共享与发布,因此在同步方法中返回时不需要进行复制;
  • 在为现有的线程安全类添加功能时,扩展方法比直接将代码添加到类中更加脆弱,因为现有的同步策略实现被分布到多个单独的源码文件中,一旦父类修改使用了不同的锁来保护状态,子类将被破坏。正确的方法是使用"组合"模式在外部使用Java监视器模式来封装现有的线程安全类,多加一层锁(带来的性能损失很小,因为底层同步不存在竞争)。
相关推荐
小白不想画工图几秒前
银河麒麟V10系统安装QT5.12
linux·开发语言·qt·银河麒麟
吴声子夜歌26 分钟前
Guava——散列
java·guava
用户31268748772027 分钟前
AQS 到底怎么排队的?CLH 队列、state 与条件变量全链路拆解
java
Json____34 分钟前
springboot开发高校选课管理系统:从零构建前后端分离的全栈实践
java·spring boot·后端·毕业设计·毕设·wwwoop.com
xcl092544 分钟前
民宿预约系统开发实战:从需求分析到上线部署全流程解析
java·spring boot
IT_Octopus1 小时前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
geovindu1 小时前
python:HandWriting Recognition using paddlepaddle
开发语言·后端·python·paddlepaddle
步行cgn1 小时前
为何以继承方式引入SpringBoot
java·spring boot·后端
CoderYanger1 小时前
A.每日一题:1140. 石子游戏 II
java·程序人生·算法·leetcode·游戏·职场和发展·深度优先
禾高网络1 小时前
养老系统开发:背景、架构与养老行业展望
java·大数据·人工智能·小程序·架构