并发编程的挑战
上下文切换
多线程不一定比串行快:当累加操作数量较小时,反而并发执行的创建线程和上下文切换的劣势显示出来。
减少上下文切换的方法:无锁并发编程(比如讲数据分段如concurrentHashMap),CAS算法(Compare and Swap,如java的Atomic包中的类),使用最少线程和使用协程(在单线程里实现duo任务的调度,并在单线程里维持多个任务间的切换)。
死锁
避免死锁的几个常见方法:
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败。
资源限制
硬件:带宽,硬盘读写速度,CPU速度
软件:数据库连接数,Socket连接数(其实数据库连接也是基于Socket连接)
解决硬件限制:服务器集群
解决软件限制:池化技术