第四章 现代并发
1并发理论
java线程模型 1)共享的 默认可见的可变状态 2)抢占式线程调度
设计理念
1)安全性与并发性安全性 不管同时发生多少操作都能确保对象保持自相一致。
2)活跃度 在一个活跃的系统中 所有做出尝试的活动最终或者取得进展 或者失败 关键那次为最终
运行时的瞬时故障 1 处于锁定状态或者在等待得到线程锁
2 等待输入(比如网络IO)
3 资源的暂时故障
4 CPU没有足够的空闲时间运行该线程
永久故障 1死锁 2不可恢复的资源问题(如NFS无法访问) 3信号丢失
3)性能 系统性能可以同过集中不同的方式量化
4)可重用性
这些原则经常相互对立 使得其趋于平衡的方法
1尽可能限制子系统之间的通信 隐藏数据对安全性非常有帮助
2 尽可能保证子系统内部结构的确定性 比如说 即使子系统会以并发的 非确定性的方式进行交互 子系统内部的设计也应该参照线程和对象的静态只是
3 采用客户端应用必须遵守的策略方针 有局限性
4 在文档最终记录所要求的行为 最逊的办法 但如果代码要部署在非常通用的环境中 就必须采用
2 块并发结构
1)同步与锁
1 只能锁定对象 不能锁定原始类型
2 被锁定的对象数组中的单个对象不会被锁定
3 同步方法可以视同为包含整个方法的同步(this){}代码块 但它们的二进制码表示时不同的
4 静态同步方法会锁定它的Class对象 因为没有实例对象可以锁定
5 如果要锁定一个类对象 请慎重考虑是用显示锁定 还是用getClass() 两种方式对子类的影响不同
6 内部类的同步是独立与外部类的
7 synchronized并不是方法签名的组成部分 所以不能出现在接口的方法声明中
8 非同步的方法不查看或关心任何锁的状态 而且在同步方法运行时 它们仍能继续运行
9 java的线程锁是可重入的 也就是说持有锁的线程在遇到同一个锁的同步点(比如一个同步方法调用同一个类内的另一个同步方法)时是可以继续的
2)线程的状态对象
就绪状态——睡眠状态——等待状态——阻塞状态——运行状态——死亡
3)完全同步对象
一个满足下面所有条件的类就是完全同步类
1所有域在任何构造方法中的初始化都能达到一致的状态
2 没有公共域
3 从任何非私有方法返回后 都可以保证对象实例处于一致的状态
4 所有方法经证明都可在有限时间内终止
5 所有方法都是同步的
6 当处于非一致状态时 不会调用其他实例的方法
7 当处于非一致状态时 不会调用非私有方法