并发编程艺术--并发编程挑战

实际上并不是并发执行就一定能比单线程执行速度更快,比如上下文切换,死锁以及资源受限等问题都会影响到并发的性能。下面我们来一一说明。

上下文切换:

在进行并发执行的时候当一个线程阻塞的时候或者时间片用完之后那么cpu就会保留当前线程执行的上下文,然后进行存储并且加载到其他线程的上下文开始执行其他线程的任务。对于保存上下文状态与加载上下文状态的操作就是上下文切换。从描述就能看出来如果频繁的进行上下文切换操作就会影响程序执行的性能。所以我们要尽可能的减少上下文切换,有以下几种方式来减少上下文的切换:

1. 无锁并发编程:当使用锁的时候竞争线程会被阻塞那么就会进行上下文切换

2.CAS算法:java的Atomic包所使用的CAS算法来更新数据,CAS原理是自旋的方式这样并不会阻塞线程因此避免了上下文切换,但是会一直占用cpu的资源

3.使用最少线程:避免创建不需要的线程比如任务很少,但是创建了大量的线程导致这些线程都处于等待的状态。

4.协程:在单线程里实现多任务的调度,并且在单线程里维持多个任务之间的切换

死锁:

锁是一个非常有用的工具,它是最常用于保证线程安全的东西,但是如果不合理的使用锁就会造成死锁,一旦产生死锁就会造成系统功能不可用,影响巨大。

因此我们介绍避免死锁的几个常见方法:

1.避免一个线程同时获取多个锁

2.避免一个线程在锁期间同时占用多个资源,尽量保证每个锁只占用一个资源

3.尝试使用定时锁,使用lock.tryLock(timeout)来替代永久锁

4.对于数据库锁,加锁和解锁必须在一个数据库里,否则会出现锁失效的情况

资源限制的挑战:

资源限制是指,在并发编程中由于一些硬件或者软件的影响导致整个并发编程的性能出现了瓶颈或者异常的情况,比如服务器带宽只有2Mb/s,单线程某个资源下载速度是1Mb/s,系统启动10个线程实际上速度并不会达到10Mb/s的。对于软件资源限制比如数据库的连接数量是有限的,如果并发过来的连接请求过多那么其他请求都会进入等待

对于硬件资源限制,可以考虑使用集群并行执行程序。也就是说单机性能已经无法满足可以采用集群的方式,通过集群的方式来增加吞吐量

对于软件资源限制,可以考虑使用资源池将资源复用。比如数据库连接池复用和Socket连接复用等操作

你可能感兴趣的:(java,数据库,开发语言)