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

第一章 并发编程的挑战

1.1 上下文切换

不管单核还是多核CPU,都能做到多线程执行代码,CPU是通过给每个线程分配CPU时间片来实现的。因为时间片都是非常的段,所以CPU的不断切换线程,让我们感觉到是多线程执行。当一个任务执行完一个时间片后会切换到另外一个任务,此时需要记住这个任务的状态,以便下次切换回这个任务时,可以加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

1.1.1 多线程一定比单线程快吗?

​ 因为线程的创建和上下文切换的开销,所以多线程并不一定比单线程快。

1.1.2 如何减少上下文切换

​ 减少上下文切换的方法:无锁并发编程、CAS算法、使用最少线程和使用协程。

​ 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免锁,如将数据的ID按照Hash算法取模分段,不用的线程处理不同段的数据。

​ CAS算法:Compare and swap,比较再交换。例如Java的Automic包下的类。

​ 使用最少线程:避免创建不需要的线程,造成大量线程处于等待状态。

​ 协程:在单线程里实现多任务调度,并在单线程里维持多个任务间的切换。

1.2 死锁

​ 避免死锁的几个常见方法:

- 避免一个线程同时获取多个锁。

- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。

- 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。

- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

1.3 资源限制的挑战

1.1.3 什么是资源限制

​ 资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。硬件资源限制:带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。软件资源限制:数据库连接、socket连接数等等。

1.1.2.资源限制引发的问题

​ 受于资源限制,并发执行可能仍然保持串行执行,这时候因为增加了上下文切换和资源调度的时间,程序将不仅不会执行得更快,反而变得更慢。

1.1.3.如何解决资源限制问题

​ 对于硬件资源限制:可以使用集群。

​ 对于软件资源限制:可以使用资源池将资源复用。

发布了156 篇原创文章 · 获赞 76 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Howinfun/article/details/100036992