并发编程初步理解
2019-04-21 本文已影响0人
趁年轻多奋斗
并发编程的目的是为了让程序更快运行,而不是通过使用更多的线程
几种并发编程的挑战以及解决方法
1. 上下文切换
当并发次数比较小时,多线程不一定比单线程要快,因为是因为线程有创建和上下文切换的开销。
如何在多线程中减少上下文切换
1.无锁并发编程,使用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
2.CAS算法。Java包使用CAS算法来更新数据,而不需要加锁。
3.使用很少的线程。避免使用不需要的线程,使得出现大量线程出现等待状态。
4.协程,在单线程中实现多任务调度,并在单线程里维持多个任务的切换。
2.死锁
1.避免多个线程同时获取多个锁
2.避免一个线程在锁内同时占有多个资源,尽量保证每个锁只占一个资源。
3.尝试使用定时锁。使用lock.tryLock(timeout)来替代内部锁机制。
4.数据库锁。加锁和解锁必须在 一个数据库连接里,否则会出现解锁失败。
3.资源限制的挑战
在进行并发编程时,往往程序执行的速度会被计算机硬件资源或软件资源的影响。
1.对于硬件资源,进行集群开发,搭建服务器集群。
2.对于软件资源,使用资源池将资源进行复用。比如使用连接池将数据库和Socket连接复用,或者在调用对方webservice接口获取数据时,只建立一个连接。