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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗凯健 中级黑马   /  2013-9-2 00:33  /  1754 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-3 08:31 编辑

看了几遍,还是不大明白。我觉得我的理解不太正确,谁能给我说说?

为什么能死锁的程序还能和谐的运行?这个锁在同步代码究竟是怎么工作的?求解。。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

8 个回复

正序浏览
这个在学习操作系统的时候也涉及了,死锁就是当两个以上的运算单元,双方都在等待对方停止运行,以取得系统资源,但是没有一方提前退出时,这种状况,就称为死锁。
其实毕老师的比喻很生动的,两个人吃饭,一人一根筷子,这时候就有两种情况:如果两个人都不肯先让步,那么他俩死都不可能吃到东西;如果一个人让步,那么就能吃到东西了。至于这里的让不让步,这个不是咱们能决定的,是操作系统干的活。
或者说是有一定概率性的,就像经常说的共享代码块,
  1. //假设有两个线程A、B
  2. public void setRes(String name,int id){//部分代码
  3.         this.name = name;
  4.                         //A可能在这里挂了嘛,但那也是肯能,并不是一定,这有概率性,是咱们决定不了的。这是一个道理
  5.         this.id = id;
  6. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
锁怎么交换?就是a用完了让出,b正好抢到,a也正好抢到a的锁。这样好吧。跟商量好似的,也可以多次各谐,你说的1线程持有A锁,2线程也持有A锁,i不对,一个线程只持有一个对象锁。其它线程只有等待。
回复 使用道具 举报
影响力147753321 发表于 2013-9-2 13:42
死锁不一定发生,但是发生了死锁,程序一定玩完。所谓死锁就是二个线程都持有一个对象锁,同时又要去拿对方 ...

终于有人答道点子上了。不过我就是不太明白,假如1线程持有A锁,2线程持有B锁,那应该是会死锁的。但是为什么会出现和谐的情况,能说一下吗?
是因为1线程持有A锁,2线程也持有A锁?这个锁是怎么交换的?
回复 使用道具 举报
死锁不一定发生,但是发生了死锁,程序一定玩完。所谓死锁就是二个线程都持有一个对象锁,同时又要去拿对方的锁。这种时就可能发生死锁。因为很可能双方持有的锁都不放,使双方都无法拿到其锁。就好比二个人都要进入a,b二个屋。一人有a屋的钥匙,一个有b屋的钥匙。如果二个商量好,一个进入a 屋后,把钥匙交给另外一个人,另一个进入b屋后,也把钥匙交给对方。这样就和谐了。不过这是理想情况。现实中很多是互不相让。这就会使二个互相等待。线程的原理类似,因为是cpu是随机选择的,这就很可能使对方线程都是拿不到对方的锁而造成死锁。要写一个死锁程序不一定好使,但程序一旦发生死锁,程序就没什么价值,所以在写程序时一定要避免死锁。尽量避免线程访问共享资源。不要使锁嵌使用。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
吴光新 来自手机 黑马帝 2013-9-2 11:43:53
报纸
多运行,当初我的也没锁住,还以为是代码问题!只要你代码没错,肯定会锁住的
回复 使用道具 举报
我的貌似也没有锁住{:soso_e101:}  写了好几层
回复 使用道具 举报
死锁,我的成功了,直接就停住了,只要你特地写的死锁代码,按道理死锁是很容易就发生的啊
回复 使用道具 举报
应该和CPU有关系,
我的U是A10 5800k 运行了这个死锁Demo  一直被和谐 从未被锁死,
死锁和机器的配置和CPU的使用率也有关系
死锁的时候cpu的使用率应该是很高的
从这看,当初毕老师的笔记本应该已经“朽”了!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马