java并发编程实践第二遍笔记(三)20171021

来源:互联网 发布:php static class 编辑:程序博客网 时间:2024/06/01 09:57

对象的组合

浅紫色为自己跟作者的一些不同看法

设计线程安全的类:
虽然可以将程序的所有状态都保存在的静态域中,但是与那些将状态封装起来的程序相比,这些程序的线程安全性更难以得到验证,并且在修改时也更难以确保其线程安全性。通过使用封装技术,可以使得在不对整个程序进行分析的情况下就可以判断一个类是否线程安全的。

不同看法
不光是共有的静态域,即时共有的非静态域也会有同样的问题,只不过引起问题的范围不同而已。将静态域定义成私有的,并做好访问管理策略,安全性跟私有的非静态类也差不多。

设计线程安全的类

对象的域包含对象中所有域的基本类型变量和引用对象和引用对象的基本类型变量和应用对象···所有能引用到的基本变量和对象。
同步策略:定义了如何在保证线程安全的情况下,对其状态的访问操作进行协同。同步策略规定了如何将不可变性、线程封闭与加锁机制等结合起来维护线程的安全性,并且还规定了哪些变量有哪些锁来保护。

1. 收集同步需求
包含多个变量的不变性条件带来原子性需求
2. 依赖状态的操作
如果在某个操作中包含有基于状态的先验条件,那么这个操作就称为依赖状态的操作。
3. 状态所有权
共享所有权和独享所有权
ServletContext中拥有的对象如果要被多个servlet共享则一定钥匙线程安全的。

实例封闭

如果某对象不是线程安全的,那么可以通过多种技术使其在多线程程序中安全地使用。比如:可以确保该对象只能由单个线程访问,或者通过一个锁来保护对该对象的所有访问。
实例封闭机制。当一个对象被封装到另一个对象中时,能够访问被封闭对象的所有代码路径都是已知的。与对象可以由整个程序访问的情况相比,更易于对代码进行分析。通过将封闭机制与合适的加锁策略结合起来,可以确保以线程安全的的方式来使用非线程安全的对象。
被封闭对象一定不能超出他们既定的作用域。可以封装在类的一个实例中,或者封闭在某个作用域内,或者封闭在线程内。
实例封闭还使得不同的状态变量可以由不同的锁来保护(后面章节的ServerStatus为具体实例)。
在Java平台的类库总还有很多线程封闭的示例,例如一些基本的容器类并非线程安全的ArrayList和HashMap但是类库提供了包装器工厂方法(Collections.synchronizedList及其类似方法),使得这些非线程安全的类可以在多线程环境中安全地使用。
java监视器模式
私有的锁对象而不是内置锁,可以将锁封装起来,使客户代码无法得到锁,但可以通过共有方法来访问锁。如果客户端代码错误的获得另一个对象的锁,那么由于不了解该对象锁的内部的用法而发生死锁的问题。此外,要想验证某个哦共有访问的锁在程序中是否被正确的使用,则需要检查整个程序,而不是单个的类。

线程安全性的委托

用组合的方式扩展。

一定要将同步策略文档化

原创粉丝点击