《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监视器模式来封装现有的线程安全类,多加一层锁(带来的性能损失很小,因为底层同步不存在竞争)。
相关推荐
隐积4 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
都叫我大帅哥6 小时前
Java JJWT 完全指南:从入门到生产级实践
java
名字还没想好☜6 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏7 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
前端开发张小七7 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
酷在前行8 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
ThsPool8 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
cxr8288 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
赤壁小虾8 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
废弃的小码农10 小时前
功能测试--Day07--Python编程基础
开发语言·python