《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监视器模式来封装现有的线程安全类,多加一层锁(带来的性能损失很小,因为底层同步不存在竞争)。
相关推荐
Escalating_xu28 分钟前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
jimy11 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
m0_380743871 小时前
PHP 8.3 缓存清除不生效怎么排查
开发语言·php
朝朝辞暮i1 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
小凡geo1 小时前
本地商家 GEO:用脚本一键生成 FAQPage 结构化数据,让 AI 切片更稳
开发语言·人工智能·python·microsoft·搜索引擎·ai
朝朝辞暮i2 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
波力海苔夹心脆6752 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
蜗牛互联网2 小时前
WSL Containers GA:本地AI容器的生命周期、网络与治理验收
java·网络·人工智能·后端
m0_380743872 小时前
Qt中导航栏实现的详细指南
开发语言·c++
mhmh1232 小时前
Python 对象模型与数据模型:魔术方法、描述符与元类深度解析
开发语言·python