charpter 2
并发控制尝试解决的问题:管理多线程访问共享变量。
线程安全:单线程下数据访问满足各种约束,如前置后置条件,以及过程中的不变性约束,多线程下保持满足。
线程安全类:类中封装了同步,对客户端透明。
原子性:多个线程不干扰彼此执行过程,执行结果等价于串行。执行中间结果不可见。
可见性:执行完成立即可见。
同步代码块:由一个对象保护代码块的执行,线程持有锁,可重入。
同个对象保护的多个代码块互斥访问。保证代码块中操作的原子性。
获取锁的顺序为串行执行的顺序
用锁保护状态:所有与状态相关的代码由锁保护,包括读(可见性保证)
多个状态:由同个锁保护
charpter 3
对象不被发布:对象封闭在线程
final域:语言实现层面保证同步,初始化安全性保证
安全发布对象:静态初始化函数初始化对象引用,引用保存在 支持原子操作的域 || final域 || 锁保护的域
仅发布时安全,不保证安全共享(额外共享规则,如只读、锁)
类库中的数据传递机制:
容器类
Future
Exchanger
charpter 4
线程安全类:抽象层次高于代码块
不变性条件的协同
前置条件的等待
对象所有权的转移(容器:所有权分离)
非线程安全类组合———实例封闭:添加前置代码路径,转发调用请求
//区分服务器客户端:所有权
//工厂模式,监视器模式
线程安全类组合————委托:组合未引入新的约束条件
现有线程安全类添加原子操作
1.修改原始类
2.改写
3.客户端加锁,要求客户端使用原始方法持有的同一个锁
4.外层嵌套,委托方法(额外一层同步)
chapter 5
同步容器类:同步对容器的访问单个api,支持客户端加锁
删除后不可迭代问题:操作的组合非原子
解决:客户端加锁
并发容器类:分段锁,不支持客户端加锁
写时复制:事件通知系统
生产者消费者模式:阻塞队列:支持阻塞与定时
消除生产者消费者代码依赖(过程解耦)
简化工作负载管理(处理速率)
同步队列:阻塞至交付?
由信号量构建容器
阻塞:线程挂起等待外部事件
中断:协作机制,请求其他线程停止执行
响应中断:
1.不捕获
2.捕获-清理-抛出
3.捕获-恢复中断状态
同步工具类:
封装并操作状态,控制线程级别的执行
闭锁:阻塞线程至事件发生
栅栏:
futuretask
信号量