第七讲 - 安全性、活跃性、性能问题
安全性问题:
何为线程安全:
从本质上,就是正确性,程序按照我们期望的执行,不出现诡异的bug;
从理论上,线程安全的程序,就是要避免原子性、可见性、有序性问题;
数据竞争:多个线程同时访问同一数据,并且至少有一个线程会写这个数据的时候,如不采取措施,则会导致并发bug;
竞态条件:程序的执行结果依赖于线程执行的顺序;
解决数据竞争和竞态条件问题:互斥,即锁;
活跃性问题:
指的是某个操作无法执行下去,有死锁、活锁、饥饿三种情况;
死锁:线程互相等待,永久阻塞;
活锁:线程没有发生阻塞,却执行不下去;
饥饿:线程因无法访问所需资源而无法执行下去的情况;
性能问题:
"锁"的过度使用可能导致串行化的范围过大,这样就不能发挥多线程优势了,不能提升性能;
无锁的算法和数据结构:线程本地存储(Thread Local Storage,TLS)、写入时复制(copy on write)、乐观锁;
减少持有锁时间:使用细粒度锁(ConcurrentHashMap)、使用读写锁(读无锁,写互斥);
性能指标:吞吐量(单位时间内能处理的请求数量)
延迟(从发出请求到收到响应的时间)
并发量(能同时处理请求的数量)