《学习笔记》并发编程的挑战

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u012898245/article/details/82353146

在程序开发中,并发编程是不可避免的,因为在有些情况下,单线程对数据的处理远远不及多线程的处理。但是并不是所有的多线程都有速度上的优势。

也就是所,并发编程也面临着挑战。

1 为什么会说启动更多的线程并不能加快数据处理的速度呢?因为在单核处理器下,多线程执行的时候,CPU通过给每个线程分配CPU时间片来执行任务。时间片是CPU分配给每个线程的时间,因为时间片非常短,一般是几十毫秒。所以CPU通过不停的切换线程执行,让我们感觉多个线程是同时执行的。线程切换前会保存上一个任务的状态,以便下次铁环回这个任务时,可以在加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。

这样的话,单核处理器下的多线程的执行就是通过来回的上下文切换来实现的。所以线程的创建和上下文切换就是线程的开销。有时候并发编程就不如串行的程序执行的快。

当然单核和多核处理器下的多线程是不一样的,传送门多核编程和单核多线程的区别

2 如何减少上下文的切换

  (1) 无锁并发编程。多线程竞争锁时,会引起上下文切换。可以通过将不同范围内的数据分配给不同的线程执行,比如对数据的ID进行Hash算法取模分段。

   (2)CAS算法:java的Atomic包使用CAS算法更新数据,不需要加锁

   (3)使用最少的线程,避免不必要的线程

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

3 避免死锁

  避免一个线程同时获得多个锁

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

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

  数据库锁,加锁和解锁必须在一个数据库连接里

4  资源限制的挑战

 硬件资源线程有带宽的上传/下载速度、硬盘读写速度和CPU的处理速度。

 软件资源限制有数据库的连接数和socket连接数等

资料来源《java并发编程的艺术》

猜你喜欢

转载自blog.csdn.net/u012898245/article/details/82353146