第一章:并发编程的挑战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013068377/article/details/83006158

一、上下文切换

即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制;
时间片是CPU分配给每个线程的执行时间,因为时间片非常短,所以CPU通过不停的切换线程执行;这就是上下文切换,上下文切换需要时间,会影响多线程的执行速度;

1.1 测试上下文切换次数和时长

经过测试发现,并发执行并不是一定串行执行耗时短,而是有某个临界值,因为并发执行有上下文切换的开销;
度量上下文切换带来的消耗的工具:

  • 使用Lmbench3可以测量上下文切换的时长
  • 使用vmstat测量上下文切换的次数

1.2 如何减少上下文切换

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

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,因此可以使用一些办法来避免使用锁,比如:将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据;
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁;
  • 使用最少线程:避免创建不需要的线程
  • 协程:在单线程里实现多任务的调度和维持多个任务间的切换;

1.3 减少上下文切换实战

1.3.1 用jstack命令dump线程信息,看看线程都在做什么

1.3.2 减少wait的线程数

二、死锁

锁时一个非常有用的工具,应用场景非常多,因为它使用起来非常简单,而且容易理解;但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用;

常见的几种避免死锁的方法:

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源
  • 尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

三、资源限制的挑战

什么是资源限制

资源限制是指在进行并发编程时,程序的执行速度受限于计算机硬件资源或者软件资源;

资源限制引发的问题

当资源有限,并发执行可能会导致CPU利用率达到100%,使程序运行的更慢,因为硬件上下文切换更慢;甚至不如串行程序执行的快;

如何解决

  1. 在多台机器上并行执行程序
  2. 在资源限制的情况下,动态调整线程

猜你喜欢

转载自blog.csdn.net/u013068377/article/details/83006158