并发编程的挑战

183 阅读3分钟

概述

  1. 并发编程的目的是为了让程序运行的更快。
  2. 在进程并发编程时,如果希望通过多线程执行任务让程序运行的更快,会面临非常多的挑战,比如:上下文切换的问题,死锁的问题,以及受限于硬件和软件的资源限制问题。

上下文切换

  1. 即便是单处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。

  2. CPU通过实践片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是切换之前会保存上一个任务的状态。以便下次切换回这个任务时,可以再加载这个任务的状态,所以任务从保存到再加载这个任务的状态,所以任务从保存到在加载的过程就是一次上下文切换。

  3. 上下文切换也会影响多线程的执行速度。

  4. 如何减少上下文切换

    i.减少上下文切换的方法有无锁编程、CAS算法、使用最少线程、使用协程。

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

    iii.CAS算法,JAVA的Atomic包使用CAS算法来更新数据,而不需要加锁。

    iiii.使用最少线程,避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

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

死锁

  1. 一旦产生死锁,就会造成系统功能不可用。

  2. 避免死锁的常见方法。

    i.避免一个线程城市获取多个锁。

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

    iii.尝试使用定时器,使用LOCk.TRYLOCK(timeOut)来代替使用内部锁机制。

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

  3. 资源限制的挑战

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

    (1).硬件资源限制有宽带的上传\下载速度,硬盘读写速度和CPU的处理速度。
    (2).软件资源限制有数据库的连接数和socket连接数等。
    

    ii.在编程中,将代码执行速度加快的原则是将代码中穿行执行的部分变成并发执行,但是如果将某段串行的代码并发执行,因为受限于资源,仍然在穿行执行,这时候,不仅不会加快执行,而会更慢,因为增加了上下文切换和资源调度的时间。

    iii.解决资源限制的问题

    (1).对于硬件资源限制,可以考虑使用集群并发执行程序。
    (2).对于软件资源限制,可以考虑使用资源也将资源复用。
    

我是菜鸟,希望大家多多留言讨论~谢谢!

我的笔记是看完Java并发编程的艺术的体会,是本好书,推荐给大家.---