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

一、什么是死锁,产生死锁的缘由,和产生死锁的必要条件数据库

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

缘由:1)竞争资源 2)推动顺序不合法性能

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

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

 二、资源竞争,好比公共类对象、文件读写、数据库操做等。线程

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

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

三、解决方案资源

     暂时想到的解决方案: 下载

1)给数据库数据加行级锁,不再用担忧多人操做了,可是大大下降了数据库查询和修改性能。

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

相关文章
相关标签/搜索