黑马程序员技术交流社区

标题: 关于死锁 [打印本页]

作者: chenshiji    时间: 2015-1-4 16:33
标题: 关于死锁
什么时候会出现死锁?可以用什么方法解决?

作者: 淡调调/ka    时间: 2015-1-4 20:17
下面是比较权威的答案
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

在毕老师的视频中有例子,其中讲到线程安全问题。多个线程执行多条语句并共享数据时,一个线程只执行了语句的一部分,还没执行完,另外的线程参与进来执行,导致共享数据的错误。
解决方法:合理的利用“锁”可以避免出现死锁。当访问共享数据时,给数据加锁,防止其他线程同时对数据进行访问。直到该线程访问完毕释放“锁”。
作者: 小僧玄奘    时间: 2015-1-4 20:43
锁还分乐观锁和悲观锁。
悲观锁就是必须等这个锁被释放,其他人才能用

乐观锁通过 Version 记录机制实现。 为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2