《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监视器模式来封装现有的线程安全类,多加一层锁(带来的性能损失很小,因为底层同步不存在竞争)。
相关推荐
eqwaak07 分钟前
数据预处理与可视化流水线:Pandas Profiling + Altair 实战指南
开发语言·python·信息可视化·数据挖掘·数据分析·pandas
SXJR11 分钟前
Spring前置准备(七)——DefaultListableBeanFactory
java·spring boot·后端·spring·源码·spring源码·java开发
共享家952740 分钟前
QT-常用控件(一)
开发语言·qt
Y学院43 分钟前
实战项目:鸿蒙多端协同智能家居控制 App 开发全流程
开发语言·鸿蒙
心态特好1 小时前
详解WebSocket及其妙用
java·python·websocket·网络协议
dlraba8022 小时前
用 Python+OpenCV 实现实时文档扫描:从摄像头捕捉到透视矫正全流程
开发语言·python·opencv
Haooog2 小时前
98.验证二叉搜索树(二叉树算法题)
java·数据结构·算法·leetcode·二叉树
武子康2 小时前
Java-143 深入浅出 MongoDB NoSQL:MongoDB、Redis、HBase、Neo4j应用场景与对比
java·数据库·redis·mongodb·性能优化·nosql·hbase
一人の梅雨2 小时前
1688 店铺商品全量采集与智能分析:从接口调用到供应链数据挖掘
开发语言·python·php
小何好运暴富开心幸福3 小时前
C++之日期类的实现
开发语言·c++·git·bash