并发要面对的事儿

上下文切换

  • 时间片一般是几十毫秒

  • 线程有创建和上下文切换的开销

  • 测试上下文切换次数和时长

    • Lmbench3:时长
    • vmstat:次数
      • Linux自带命令
  • CS(Content Switch):上下文切换次数

  • 如何减少上下文切换
    • 无锁并发编程
      • 数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据
    • CAS算法
      • Java的Atomic包使用CAS算法来更新数据,且无需加锁
    • 使用最少线程
      • 避免创建不需要的线程
    • 协程
      • 在单线程里实现多任务的调度
      • 在单线程里维持多个任务间的切换

死锁

  • 避免死锁的方法
    • 避免一个线程同时获取多个锁
    • 避免一个线程在锁内同时占用多个资源
      • 尽量保证每个锁只占用一个资源
    • 尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制
    • 对于数据库锁,加锁和解锁必须在同一个数据库连接里
      • 否则会出现解锁失败的情况

资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源

  • 硬件资源
    • 带宽的上传/下载速度
    • 硬盘读写速度
    • CPU的处理速度
  • 软件资源
    • 数据库的连接数
    • socket连接数
    • 等等

在并发编程中,如果将某段串行的代码并发执行,因为受限于资源,仍然在串行执行,这时候程序不会加快,反而会更慢,因为增加了上下文切换和资源调度的时间。

  • 解决办法
    • 硬件资源限制
      • 使用集群并行执行
    • 软件资源限制
      • 采用资源池将资源复用

根据不同的资源限制调整程序的并发度