并发

作者: lishangfu | 来源:发表于2018-07-13 00:14 被阅读0次

    为什么要使用并发机制?

    • 并发指的是多个任务交替进行, 使用并发提高系统处理任务的能力,特别是现在大数据时代,对于单位时间系统处理数据的能力要求越来越高,能及时处理用户请求,成为一种必要的系统需求。

    并发中的锁

    锁就是当一个线程获得对资源使用权时,该线程就拥有了该资源的锁,其他线程只能处于等待状态,当线程释放对于临界区的锁时,其他线程才能根据优先级去获取临界区资源的锁。这里需要考虑线程的安全问题,当线程A占用了资源resourceA, 并且正在等待要被线程B占用的resourceb,这里就会出现相互等待,形成死锁。那么如何去避免这种死锁问题呢,可以有如下方式:

    • 避免一个线程同时获得多个锁;
    • 避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源;
    • 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞;
    • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况
      经常碰到的一个问题时,在一个数据库session里面,给session加了锁,如果session的执行过程顺利,最后锁会被释放,但是并没有考虑到当session中执行失败时并没有去释放锁,这样锁无法释放而最终导致严重的系统问题。

    并发与并行的比较

    • 并发是多个任务交替执行,利用时间分片
    • 并行发生在多个cpu环境中,当系统只有一个cpu时,只能通过时间分片执行多线程功能,也就是并发执行

    同步与异步

    • 同步,例如在一个没有使用异步技术(ajax)的网站中,用户提交一个请求,网站会在等待后台的回复,在未拿到后台数据之前,整个网页都处于悬挂状态,用户体验感比较差
    • 异步,较而言之,异步就是只需完成某项操作,无需关心整个执行过程,比如网购,当你付款之后,其他事都不用管了,收到通知就去取货就行。

    阻塞和非阻塞

    阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。


    临界区

    临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每个线程使用时,一旦临界区资源被一个线程占有,那么其他线程必须等待。

    相关文章

      网友评论

          本文标题:并发

          本文链接:https://www.haomeiwen.com/subject/cledpftx.html