第十章 避免活跃性危险
锁顺序死锁:定义锁的顺序,可以通过某种方法决定每个锁的顺序,比如hashcode或者序列号之类的
在锁的调用顺序不是很明显的情况下,在持有锁的情况下调用其他外部方法一定要注意,可以通过开放调用,避免发生死锁的危险,即使用同步代码块保护仅仅保护那些共享变量即可,但这种降低锁粒度的方法可能会使得原本大的代码块失去原子性,解决办法为:将服务的状态改为关闭之前一直持有锁,状态改变之后,其他线程也就能够看到关闭信息从而不会再次执行关闭操作。。。
死锁的诊断与避免: 通过trylock设置定时器来避免死锁;通过线程转储信息来分析死锁;多个线程不可以同时使用同一个JDBC连接
饥饿与慢响应、活锁
避免活锁的办法:在重试机制中引入随机性
第十一章 性能与可伸索性
性能的衡量指标:运行速度、处理能力
如何评估?如何权衡?
amdahl定律
线程引入的开销:上下文切换、内存同步、
现代的JVM都可以自动优化锁和内存重排序
减少锁的竞争:减少锁的持有时间、减低锁的请求频率、使用带有协议机制的独占锁
1、快入快出
2、将由一个锁保护的多个变量分解为多个锁保护的单个变量
对一组独立对象上的锁分段
3、使用并发容器代替独占锁等方法,如读写锁、不可变对象、原子变量
轻易别用对象池
减小上下文切换开销
时间: 2024-10-02 05:30:08