第十章 避免活跃性危险

锁顺序死锁:定义锁的顺序,可以通过某种方法决定每个锁的顺序,比如hashcode或者序列号之类的

在锁的调用顺序不是很明显的情况下,在持有锁的情况下调用其他外部方法一定要注意,可以通过开放调用,避免发生死锁的危险,即使用同步代码块保护仅仅保护那些共享变量即可,但这种降低锁粒度的方法可能会使得原本大的代码块失去原子性,解决办法为:将服务的状态改为关闭之前一直持有锁,状态改变之后,其他线程也就能够看到关闭信息从而不会再次执行关闭操作。。。

死锁的诊断与避免:    通过trylock设置定时器来避免死锁;通过线程转储信息来分析死锁;多个线程不可以同时使用同一个JDBC连接

饥饿与慢响应、活锁

避免活锁的办法:在重试机制中引入随机性

第十一章 性能与可伸索性

性能的衡量指标:运行速度、处理能力

如何评估?如何权衡?

amdahl定律

线程引入的开销:上下文切换、内存同步、

现代的JVM都可以自动优化锁和内存重排序

减少锁的竞争:减少锁的持有时间、减低锁的请求频率、使用带有协议机制的独占锁

1、快入快出

2、将由一个锁保护的多个变量分解为多个锁保护的单个变量

对一组独立对象上的锁分段

3、使用并发容器代替独占锁等方法,如读写锁、不可变对象、原子变量

轻易别用对象池

减小上下文切换开销