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

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

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

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

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

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

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

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

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

3、解决方案

     暂时想到的解决方案: 

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

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