并发的挑战

260 阅读1分钟

并发的挑战

1. 上下文切换

  • 过多的线程会导致上下文切换频繁
  • 太少的线程无法利用多核处理器的性能

2. 死锁

出现死锁主要是各自持有对方需要的资源并不释放;

  • A线程持有A锁并等待获取B锁
  • B线程持有B锁并等待获取A锁

解决死锁的几个方法:

  1. 避免一个线程同时获取多个锁
  2. 保证获取锁的顺序一致,比如多个线程都是从A到B
  3. 设定等待锁的超时时间

3. 资源限制

什么是资源限制?

程序在运行时受限于运行环境的硬件跟软件资源, 比如下载速度是最大1m,启动10个线程还是1m

资源限制引发的问题

当超出资源的限制时,程序不会更快反而更慢。 比如cpu已经饱和100%, 再启动多余的线程只会增加线程上下文的切换

如何解决资源限制的问题

单台机器资源已经饱和时,可以考虑多台机器集群的形式横向拓展。 比如单台机器只能处理100万数据, 现在有1000w,可以考虑用10台机器,每条数据跟机器数取模负载均衡的方式分配处理。 另外就是资源复用, 比如复用长链接, 连接池等方案