java并发编程实践-1.3 线程的风险

缘起

java并发编程实践1.3节 线程的风险

分析

多线程技术的引入会带来以下风险

  1. 安全风险
  2. 活跃度失败(liveness failed)
  3. 性能风险

安全风险

因为线程共享进程的内存地址空间,但是又有各自的工作副本,如果副本存储在寄存器或者高速缓存中的话,则线程对其的改变对其他的线程可以说暂时(甚至永远)不可见. 但是众所周知,将数据缓存在寄存器或者高速缓存中是有利于程序的性能的. 因此多线程程序的开发者必须要明确数据在线程之间如何共享才能使得缓存优化不会触发安全风险.

活跃度失败

简而言之,例如死锁、饥饿、活锁 导致有些线程永远无法获得继续执行的机会,这就是活跃度失败

性能风险

简而言之,就是线程的切换是需要耗费CPU资源的——因为线程调度程序从线程A切换到线程B的时候,总要先保存A的执行上下文,再恢复B的执行上下文. 甚至如果A和B之间有数据共享的话,则还需要数据同步——可能导致清空高速缓存、在共享内存的总线上创建同步通信,总之,线程的切换回导致CPU在切换这件事情上的耗费可能比执行线程这件事情上消耗的更多!