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

一、设计线程安全的类

在设计线程安全类的过程中,须要包括下面三个基本要素:

. 找出构成对象状态的全部变量。

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

. 建立对象状态的并发訪问管理策略。

分析对象的状态,首先从对象的域開始。 变量按作用域划分:

. 全局变量

. 局部变量

. 方法行參

. 异常处理參数

1. 收集同步需求

假设不了解对象的不变性条件与后验条件,那么就不能确保线程安全性。要满足在状态变量的有效值或状态转换上的各种约束条件。就须要借助原子性和封装性。

说的更简略些是Java线程安全都是由于共享变量,共享变量后会由于多个线程同一时候改动导致不对的问题,所以收集一共同拥有多少处会涉及到这些须要同步的变量,仅仅有收集说有可能出问题的因素基于此之上保证全部元素线程安全也才干保证程序是线程安全的。

2. 依赖状态的操作

先验条件是值满足某个条件之后才干进行处理。比如:首先推断一个队列是否为空,假设为空。

。。

,假设不为空。。

。当中推断队列是否为空就是先验条件。

假设在某个操作中包括有基于状态的先验条件。那么这个操作就称为依赖状态的操作。

? 满足可见性就能够?

3. 状态的全部权

单独一个基本对象比較保证其安全性,可是假设是包括对象的集合(容器类 比如:ArrayList),容器类通常表现出一种“全部权分离”的形式。

即使用线程安全的容器类(Collections.synchronizedList(List<T>)),也仅仅能保证容器相关的操作是线程安全的,假设公布了可变对象的引用。就不会拥有独占的控制权。(非线程安全)

二、实例封装

将数据封装在对象内部,能够将数据的訪问限制在对象的方法上,从而更easy确保线程在訪问数据时总能持有正确的锁。

封闭机制更易于构造线程安全的类,由于当封闭类的状态时,在分析类的线程安全性时就无须检查整个程序。

即使封闭能保证对象内全部处理都是现成安全的,可是还须要注意当对象公布后还是可能出现故障,比如HashSet<Persion> 除保证Persion是线程安全外,还须要保证使用它的Set集合是线程安全的。

- 样例 对象中仅有一个变量,保证此变量线程安全。在方法上使用synchronized

1. Java监听器模式

synchronized通过指定对象锁定

2. 演示样例:车辆追踪

- 保证容器类实例、容器类包括元素实例线程安全。

三、线程安全性的托付

. 实例讲诉怎样保证集合类及其包括类线程安全性

. 在现有的线程安全类中加入功能

继承自当前集合类,加锁使加入的方法保证安全性,可是这样比較脆弱。

组合方式,查看书籍源代码

. 将同步策略文档化

时间: 2024-11-10 07:46:20

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

《Java并发编程实战》第二章 线程安全性 读书笔记

一.什么是线程安全性 编写线程安全的代码 核心在于要对状态访问操作进行管理. 共享,可变的状态的访问 - 前者表示多个线程访问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范完全一致. 多个线程同时操作共享的变量,造成线程安全性问题. * 编写线程安全性代码的三种方法: 不在线程之间共享该状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 Java同步机制工具: synchronized volatile类型变量 显示锁(Explicit Lock

Java并发编程实战 第16章 Java内存模型

什么是内存模型 JMM(Java内存模型)规定了JVM必须遵循一组最小保证,这组保证规定了对变量的写入操作在何时将对其他线程可见. JMM为程序中所有的操作定义了一个偏序关系,称为Happens-Before.两个操作缺乏Happens-Before关系,则Jvm会对它们进行任意的重排序. Happends-Before的规则包括: 1. 程序顺序规则.若程序中操作A在操作B之前,则线程中操作A在操作B之前执行. 2. 监视器锁规则.在同一监视器锁上的解锁操作必须在加锁操作之前执行.如图所示,

读书笔记-----Java并发编程实战(二)对象的共享

1 public class NoVisibility{ 2 private static boolean ready; 3 private static int number; 4 private static class ReaderThread extends Thread{ 5 public void run(){ 6 while(!ready) 7 Thread.yield(); 8 System.out.println(number); 9 } 10 } 11 12 public s

JAVA并发编程实战---第三章:对象的共享(2)

线程封闭 如果仅仅在单线程内访问数据,就不需要同步,这种技术被称为线程封闭,它是实现线程安全性的最简单的方式之一.当某个对象封闭在一个线程中时,这种方法将自动实现线程安全性,即使被封闭的对象本生不是线程安全的. 实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发.避免并发最简单的方法就是线程封闭.什么是线程封闭呢? 就是把对象封装到一个线程里,只有这一个线程能看到此对象.那么这个对象就算不是线程安全的也不会出现任何安全问题.实现线程封闭有哪些方法呢? 1:ad-hoc线程封闭 这是完全靠

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

在没有同步的情况下,编译器.处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整.在缺乏足够同步的多线程程序中,要对内存操作的执行顺序进行判断几乎无法得到正确的结果. 非原子的64位操作 当线程在没有同步的情况下读取变量时,可能会读到一个失效值,但至少这个值是由之前的某个线程设置,而不是一个随机值.这种安全性保证也被称为最低安全性. Java内存模型要求:变量的读取操作和写入操作都必须是原子操作,但对于非Volatile类型的long和Double变量,JVM允许将64的读操作或写操作

JAVA并发实战 第四章 对象的组合

4.1 设计线程安全的类 通过使用封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否是线程安全的. 在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量:找出约束状态变量的不变性条件:建立对象状态的并发访问管理策略. 要分析对象的状态,首先从对象的域开始. 同步策略(Synchronization Policy)定义了如何在不违背对象不变条件或后验条件的情况下对其状态的访问操作进行协同.同步策略规定了如何将不可变性.线程封闭与加锁机制结合起来以维护线程

Java并发编程实战 第15章 原子变量和非阻塞同步机制

非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁. 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势. 实现非阻塞算法的常见方法就是使用volatile语义和原子变量. 硬件对并发的支持 原子变量的产生主要是处理器的支持,最重要的是大多数处理器架构都支持的CAS(比较并交换)指令. 模拟实现AtomicInteger的++操作 首先我们模拟处理器的CAS语法,之所以说模拟,是因为CAS在处理器中是原子操作直接支持的.不需要加锁. public s

《Java并发编程实战》第九章 图形用户界面应用程序界面 读书笔记

一.为什么GUI是单线程化 传统的GUI应用程序通常都是单线程的. 1. 在代码的各个位置都须要调用poll方法来获得输入事件(这样的方式将给代码带来极大的混乱) 2. 通过一个"主事件循环(Main Event Loop)"来间接地运行应用程序的全部代码. 假设在主事件循环中调用的代码须要非常长时间才干运行完毕,那么用户界面就会"冻结",直到代码运行完毕.这是由于仅仅有当运行控制权返回到主事件循环后,才干处理兴许的用户界面事件. 非常多尝试多线程的GUI框架的努力

java并发编程实战-第2章-线程安全性

2. 线程安全性 2.1 什么是线程安全性 线程安全类:当一个类被多个线程访问时,不管运行环境中如何调度,这些线程如何交替执行,并且在调用的代码部分不需要额为的同步或者协同.这个类为线程安全类 Thread-safe classes encapsulate any needed synchronization so that clients need not provide their own. 2.1.1. Example: A Stateless Servlet Stateless obje