A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chenshiji 中级黑马   /  2015-1-4 16:33  /  1025 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

什么时候会出现死锁?可以用什么方法解决?

2 个回复

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

在毕老师的视频中有例子,其中讲到线程安全问题。多个线程执行多条语句并共享数据时,一个线程只执行了语句的一部分,还没执行完,另外的线程参与进来执行,导致共享数据的错误。
解决方法:合理的利用“锁”可以避免出现死锁。当访问共享数据时,给数据加锁,防止其他线程同时对数据进行访问。直到该线程访问完毕释放“锁”。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报 1 0
锁还分乐观锁和悲观锁。
悲观锁就是必须等这个锁被释放,其他人才能用

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

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马