并发编程的目的在于使得程序运行速度加快,而实现并发编程期间存在诸如:上下文切换的问题、死锁的问题、受限于软硬件资源的限制问题;解决上述问题能够更好的书写并发代码。
上下文切换的问题
如何减少上下文切换次数呢?(1)无锁并发编程,多线程竞争锁时,将会引起上下文切换,因此我们避免使用锁,如将数据的ID按照Hash算法取模分段,不同线程处理不同段的数据;(2)CAS算法,Atomic包使用CAS算法更新数据,不需要加锁;(3)使用最少线程;(4)协程,单线程中实现多个任务的调度,并在单线程里维持多个任务间的切换。
死锁的问题
如何避免死锁呢?(1)避免一个线程同时获取多个锁;(2)避免一个线程在锁内占用多个资源,尽量保证每个锁只占用一个资源;(3)尝试使用定时锁,使用lock.tryLock()替代内部锁机制;(4)对于数据库锁,加锁和解锁必须在一个数据库链接里。
资源限制的问题
资源限制的问题,什么时资源限制问题呢?并发编程过程中,程序的执行速度受限于计算机软硬件资源影响。如硬件资源限制,如带宽的上下行速度(上传/下载速度)、硬盘读写速度以及CPU处理速度等;软件限制,如数据库的链接数和socket连接数等。
资源限制引发何种问题?并发编程实质就是将代码中串行执行的代码变成并发执行,而受限于资源,该代码实际上还是串行执行,但是我们代码改成了并发执行,这样就导致代码会产生额外的时间消耗,如上下文切换和资源调度的时间,这样不仅不能加快速度反而降低速度了。
那么如何解决资源限制的问题呢?最简单的问题就是加强PC段的硬件资源,但是还是会存在上限问题,那么这时候我们就考虑分布式系统以及集群的效果了,进行分担压力以及单项集中处理;比如不同的机器处理不同的问题,问题集中并分担压力,“数据%机器数”的方式分配压力,这就解决了硬件资源限制问题;那么软件资源限制问题如何解决呢?最简单的问题就是创建连接池,连接池将数据库和Socket连接复用,无需多次创建socket,降低了连接数。