4.1设计线程安全的类

包含三个基本要素:

1.找出构成对象状态的所有变量

2.找出约束状态变量的不变性条件

2.简历对象状态的并发访问管理策略

对象的状态: 域

基本类型所有域, 引用类型包括被引用对象的域

同步策略:不违背对象不变条件下对其状态的访问进行协同。

同步策略规定了如何将不可变性,线程封闭,加锁机制结合起来维护线程的安全性,并且规定了那些变量由哪些锁保护,最好写正式文档。

1.收集同步需求

不变性条件中包含多个变量,任何访问相关变量的操作都需要持有保护这些变量的锁。

2.依赖状态的操作

如果某个操作中包含有依赖状态的先验条件,即为依赖状态的操作。例如集合中取值,需先判断集合不能为空。

并发程序中先验条件可能会因为其他线程变为真,所以并发线程需等待,知道先验条件为真继续执行。

Java中等待某个先验条件为真的机制(等待和通知机制)不容易,可以使用 现有类库中的类入 bolcking queue或者samephore等来实现依赖状态的行为。

4.2实例封闭

讲数据封装在对象内部,讲数据 的访问控制在方法上。

ArrayList hashset 都不是线程安全的,但是有collections.synchronized()。

封闭讲线程安全控制在类中 ,更小的范围内。

1. Java监视器模式

会把对象的所有状态封装起来,并用对象的内置锁来保护状态。

通过复制方式不发布对象

4.3线程安全性的委托

不独立则需要加锁

3.发布底层的状态变量

4.4在现有的线程安全类中添加功能:

要考虑同步策略。

如果扩展该类,需要确保是同一把锁,是否与父类中的同步策略一样。

不是同一个锁,不行

同步封装器类文档指出用的内置锁,所以直接用list对象做锁。

这种客户端加锁很脆弱,将同步分布在多个类中。

相当于用一个新的锁重写整个类。

4.5

总结:

java并发编程实战笔记---(第四章)对象的组合的更多相关文章

  1. 《Java并发编程实战》第四章 对象的组合 读书笔记

    一.设计线程安全的类 在设计线程安全类的过程中,须要包括下面三个基本要素:  . 找出构成对象状态的全部变量.  . 找出约束状态变量的不变性条件.  . 建立对象状态的并发訪问管理策略. 分析对象的 ...

  2. java并发编程实战:第四章----对象的组合

    一.设计线程安全的类 找出构造对象状态的所有变量(若变量为引用类型,还包括引用对象中的域) 约束状态变量的不变性条件 建立对象状态的并发访问管理策略(规定了如何维护线程安全性) 1.收集同步需求(找出 ...

  3. 《Java并发编程实战》第三章 对象的共享 读书笔记

    一.可见性 什么是可见性? Java线程安全须要防止某个线程正在使用对象状态而还有一个线程在同一时候改动该状态,并且须要确保当一个线程改动了对象的状态后,其它线程能够看到发生的状态变化. 后者就是可见 ...

  4. java并发编程实战笔记---(第二章)线程安全:正确性

    ThreadA__________     同步 ______________ 异步 ___________     异步 ThreadB__________         ____________ ...

  5. java并发编程实战:第三章----对象的共享

    我们不仅仅希望防止某个线程使用某个状态时,另一个线程在修改它:我们还希望某个线程修改了某个状态后,其他线程能够看到状态的变化. 一.可见性 重排序:在没有同步的情况下,编译器.处理器可能对代码的执行顺 ...

  6. Java并发编程学习笔记(三)——对象的组合

    重要概念: 1.在设计线程安全类的过程中,需要包含以下三个基本要素: (1)找出构成对象状态的所有变量. (2)找出约束状态变量的不变性条件. (3)建立对象状态的并发访问管理策略. 2.

  7. Java并发编程实战.笔记十一(非阻塞同步机制)

    关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...

  8. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  9. 【Java并发编程实战】—– AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形. 其主要从双方面进行了改造:节点的结构与节点等待机制.在结构上引入了 ...

  10. 《Java并发编程实战》第六章 任务运行 读书笔记

    一. 在线程中运行任务 无限制创建线程的不足 .线程生命周期的开销很高 .资源消耗 .稳定性 二.Executor框架 Executor基于生产者-消费者模式.提交任务的操作相当于生产者.运行任务的线 ...

随机推荐

  1. 聊聊flink Table的groupBy操作

    本文主要研究一下flink Table的groupBy操作 Table.groupBy flink-table_2.11-1.7.0-sources.jar!/org/apache/flink/tab ...

  2. Unity3D for VR 学习(6): 再次温故知新-3D数学

    一年前,系统学习过3D数学,并记录了一篇博客<C#程序员整理的Unity 3D笔记(十):Unity3D的位移.旋转的3D数学模型>. 一年后,再次温习之. 坐标系:Unity3D使用左手 ...

  3. redis的Pub/Sub功能

    Pub/Sub功能(即Publish,Subscribe)意思是发布及订阅功能.简单的理解就像我们订阅blog一样,不同的是,这里的客户端与server端采用长连接建立推送机制,一个客户端发布消息,可 ...

  4. JAVA本地TXT文件解决中文乱码问题

    import java.io.*; public class ReadFile { public static void main(String[] args) { try { File file = ...

  5. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  6. django 自定义认证

    在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...

  7. 很好的c++和Python混合编程文章

    c++中嵌入python入门1 本人是用vc2003+python2.5学习的,其它的也应该差不了多少 0. 坏境设置把Python的include/libs目录分别加到vc的include/lib ...

  8. webstorm 激活破解方法大全

    webstorm 作为最近最火的前端开发工具,也确实对得起那个价格,但是秉着勤俭节约的传统美德,我们肯定是能省则省啊. 方法一:(更新时间:2018/1/23)v3.3 注册时,在打开的License ...

  9. AbstractTransactionalJUnit4SpringContextTests事务回滚

    在单元测试中继承AbstractTransactionalJUnit4SpringContextTests类的 时候,会默认事务回滚. 需要照常执行的话,在执行的测试方法上添加@Rollback(fa ...

  10. 数学&模拟:随机化-矩阵随机化

    BZOJ2396 给出三个行数和列数均为N的矩阵A.B.C,判断A*B=C是否成立 随机生成一个N乘1的矩阵R 然后判断A*B*R是否等于C*R,而前者相当于A*(B*R) 与后者一样都可以在O(N2 ...