1.安全性问题
线程安全:本质上就是正确性。
避免原子性问题,可见性问题,有序性问题,就是线程安全的程序
什么情况需要考虑安全性问题?
存在共享数据并且该数据会发生变化。多线程同时读写同一数据。
如果不共享数据,状态就不会发生变化
ThreadLocal,TLS ,不变模式
2.活跃性问题
某个操作无法执行下去
死锁就是活跃性问题
活锁:等待一个随机事件就可以了
饥饿:线程因无法访问所需资源而无法执行下去
3.性能问题
锁的国度使用,导致串行范围过大,体现不了多线程优势了
串行的百分比5%
如果多线程呢?
第一,使用锁会带来性能问题,解决方案呢?
使用无锁算法和数据结构
使用Thread Local,copy-on-write,乐观锁
java并发包里的原子类也是无锁的数据结构。Disruptor无锁的内存你队列
第二,减少锁持有的时间
细粒度锁ConcurrnetHashMap,分段锁技术,读写锁,读无锁,写有所锁
性能方面的度量指标?
吞吐量:单位时间内能处理的请求数量,吞吐量越高,性能越好。
延迟:从发出请求到收到响应的时间,延迟越小,性能越好。
并发量:同事处理的请求数量,并发量增加,延迟会增加,延迟这个这表要基于并发量来说,
4.总结
并发程序
重点关注安全性,活跃性,及性能;安全性方面注意数据竞争和竞态条件,活跃性方面注意死锁,活锁,饥饿等问题。