《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监视器模式来封装现有的线程安全类,多加一层锁(带来的性能损失很小,因为底层同步不存在竞争)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/86559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven高级---分模块设计,继承(继承关系/版本锁定/自定义属性)

目录 分模块设计 继承与聚合 继承关系 ​案例​ 版本锁定 自定义属性/引用属性 分模块设计 把一个项目拆分成不同的模块 我们可以把原来一个项目包中的东西单独提出来作为一个模块,也是解耦的思想 然后我们可以通过引入依赖的方式将这两个模块引入,如下 继承与聚合 继…

xxe攻击(XML外部实体)

1.定义 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 http://www.w3school.com.…

初识操作系统

目录 一.操作系统的概念 二.正确理解“管理” 三.操作系统对硬件进行管理 四.系统调用接口 五.用户操作接口 一.操作系统的概念 操作系统是一款进行软硬件资源管理的软件 现在我们知道了操作系统的概念了,那么为什么要有操作系统呢? 操作系统将软…

李宏毅hw-9:Explainable ML

——欲速则不达,我已经很幸运了,只要珍惜这份幸运就好了,不必患得患失,慢慢来。 ----查漏补缺: 1.关于这个os.listdir的使用 2.从‘num_文件名.jpg’中提取出数值: 3.slic图像分割标记函数的作用&#xf…

光电探测器怎么选

光电探测器,也称为PD(photodetector) 基本原理是,光信号进入光电探测器转换为电压信号,这个电压信号会很弱,微伏或者毫伏级别。 所以PD分为带放大和不带放大 带放大呢,是因为信号太弱&#xf…

Vue系列(二)之 基础语法上篇【插值,指令,过滤器,计算属性监听属性】以及购物车实现

目录 一. 插值 1.1 文本 1.2 原始HTML 1.3 属性 1.4 表达式 二. 指令 2.1 v-if/v-else-if/v-else指令 2.2 v-show指令 2.3 v-for指令 2.4 下拉框/复选框 2.5 动态参数 三. 过滤器 3.1 局部过滤器基本应用 3.2 局部过滤器串行使用 3.3 局部过滤器传参 3.4 全局过…

内存映射的注意事项

1.如果对mmap的返回值(ptr)做操作(ptr),munmap是否能够成功? 可以,但是不建议 2.如果open时O_RDONLY,mmap时prot参数指定PROT READPROT WRITE会怎样? 错误,返回MAP_FAILED open()函数中的权限建议和prot参数的权限保持…

GsonUtils和字符串

文章目录 1、GsonUtils2、String本身,可以加入日志信息3、 Json和Map转换4、Date转为Json字符串5、Json和List<T>转换6、 比较两个JSON字符串的不同7、 字符串填充&#xff1a;生成单据号时填充8、 String.format()的使用9、截断字符串10、splitisNotBlank 和 isNotEmpty…

QT学习之创建项目

1、添加快捷键到桌面 找到所在安装路径Qt5.14.1\Tools\QtCreator\bin添加至桌面 双击后打开 2、创建项目 点击下一步 再点击下一步 下一步 当前暂时选择32位&#xff0c;之后点击完成 3、进入编辑页面并运行 运行快捷键&#xff1a;CtrlR 运行界面点击按钮&#xff1a; 运行…

C# 如何使用windows服务做定时任务

在 C# 中&#xff0c;你可以使用 Windows 服务来创建定时任务。以下是创建定时任务的步骤&#xff1a; 创建一个新的 Windows 服务项目&#xff1a; 打开 Visual Studio。选择 “创建新项目”。在搜索框中搜索 “Windows 服务”。选择 “Windows 服务” 模板&#xff0c;并设置…

单臂路由的详细配置步骤

1、单臂路由概述 单臂路由&#xff08;router-on-a-stick&#xff09;是指在路由器的一个接口上通过配置子接口&#xff08;或“逻辑接口”&#xff0c;并不存在真正物理接口&#xff09;的方式&#xff0c;实现原来相互隔离的不同VLAN&#xff08;虚拟局域网&#xff09;之间…

C++笔记之引用折叠规则

C笔记之引用折叠规则 文章目录 C笔记之引用折叠规则1. 当两个左值引用结合在一起时&#xff0c;它们会折叠成一个左值引用。2. 当一个左值引用和一个右值引用结合在一起时&#xff0c;它们会折叠成一个左值引用。3. 当两个右值引用结合在一起时&#xff0c;它们也会折叠成一个右…

【网络协议】Http-上

Http请求结构&#xff1a; 结构图1&#xff1a; 实验解析请求报文&#xff1a; 1.在Edge浏览器上输入ip地址端口号文件资源&#xff0c;也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1)&#xff0c;如下 GET …

Python机器学习实战-特征重要性分析方法(1):排列重要性(附源码和实现效果)

实现功能 排列重要性 PermutationImportance&#xff1a;该方法会随机排列每个特征的值&#xff0c;然后监控模型性能下降的程度。如果获得了更大的下降意味着特征更重要 实现代码 from sklearn.datasets import load_breast_cancer from sklearn.ensemble import RandomFore…

C语言之字符函数字符串函数篇(2)

目录 字符串查找 strstr strstr的使用 strstr的模拟实现 分析 考虑点 代码 strt strtok的使用 循环改进 错误信息报告 strerror 错误码的错误信息 strerror的使用 perror 字符操作 字符分类函数 字符转化函数 今天我们接着讲字符串函数&#xff0c;也…

LuatOS-SOC接口文档(air780E)--crypto - 加解密和hash函数

crypto.md5(str) 计算md5值 参数 传入值类型 解释 string 需要计算的字符串 返回值 返回值类型 解释 string 计算得出的md5值的hex字符串 例子 -- 计算字符串"abc"的md5 log.info("md5", crypto.md5("abc"))crypto.hmac_md5(str, k…

balenaEtcher格式化的U盘恢复原来样子

今天用balenaEtcher烧录了U盘&#xff0c;刷机N1盒子openwrt, 刷完机结果发现自己的U盘电脑最后只有167M 想要恢复原来的64G以下是方法&#xff0c;使用win10系统 1、打开命令行cmd&#xff08;winr打开运行&#xff0c;在其中输入cmd就可以打开&#xff09;&#xff1b; 2…

C++QT day11

绘制时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent>//绘制事件类 #include <QDebug>//信息调试类 #include <QPainter>//画家类 #include <QTimer>//定时器类 #include <QTime> #include &…

Android---打开相机拍照

简单实现打开系统系统相机拍一张图片并显示在UI上&#xff0c;适用与个人主页头像的切换。 1. 添加权限。AndroidManifest.xml里添加使用相机的权限。 <uses-permission android:name"android.permission.CAMERA"/> 2. 布局。布局内容比较交单&#xff0c;一…