• web开发中的多线程死锁问题,避免死锁


    1、什么是死锁,产生死锁的原因,和产生死锁的必要条件

         所谓死锁(DeadLock),是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局,当进程或线程处于僵局时,若无外力作用,它们将无法再向前推进。

    原因:1)竞争资源 2)推进顺序不合法

    必要条件:1)互斥条件 2)请求与保持条件 3)不剥夺条件 4)环路等待条件

    以上参考计算机操作系统第三版 

     2、资源竞争,比如公共类对象、文件读写、数据库操作等。

         场景:多线程抓取url内容,每条url抓取状态存储在数据库中,没有抓取,正在抓取,已经抓取。

    多个线程去数据库中取状态为没有抓取的url进行抓取,直到所有的url状态都为正在抓取,已经抓取。看上去好像没什么问题,但是发生了不同的线程操作同一个url资源的问题,其实是因为获取url到开始下载url内容。这段时间 是有延迟的,因此,url抓取状态不会及时的改变。这样就导致数据库数据行死锁。 

    3、解决方案

         暂时想到的解决方案: 

    1)给数据库数据加行级锁,再也不用担心多人操作了,但是大大降低了数据库查询和修改性能。

     2)合理的划分任务,每个线程只做自己的事情,不相互竞争url资源,这下既考虑到数据库性能,又解决了资源竞争的问题。

  • 相关阅读:
    BZOJ3669
    HDU3726
    BZOJ3282
    BZOJ2843
    Link/cut Tree
    Codeforces396A
    LOJ6277~6285 数列分块入门
    Codeforces446C
    Codeforces475D
    Codeforces103D
  • 原文地址:https://www.cnblogs.com/Jack-hui/p/3823415.html
Copyright © 2020-2023  润新知