并发的挑战
1. 上下文切换
- 过多的线程会导致上下文切换频繁
- 太少的线程无法利用多核处理器的性能
2. 死锁
出现死锁主要是各自持有对方需要的资源并不释放;
- A线程持有A锁并等待获取B锁
- B线程持有B锁并等待获取A锁
解决死锁的几个方法:
- 避免一个线程同时获取多个锁
- 保证获取锁的顺序一致,比如多个线程都是从A到B
- 设定等待锁的超时时间
3. 资源限制
什么是资源限制?
程序在运行时受限于运行环境的硬件跟软件资源, 比如下载速度是最大1m,启动10个线程还是1m
资源限制引发的问题
当超出资源的限制时,程序不会更快反而更慢。 比如cpu已经饱和100%, 再启动多余的线程只会增加线程上下文的切换
如何解决资源限制的问题
单台机器资源已经饱和时,可以考虑多台机器集群的形式横向拓展。 比如单台机器只能处理100万数据, 现在有1000w,可以考虑用10台机器,每条数据跟机器数取模负载均衡的方式分配处理。 另外就是资源复用, 比如复用长链接, 连接池等方案