黑马程序员技术交流社区

标题: 多线程死锁部分,毕老师的视频 [打印本页]

作者: 罗凯健    时间: 2013-9-2 00:33
标题: 多线程死锁部分,毕老师的视频
本帖最后由 杨增坤 于 2013-9-3 08:31 编辑

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

为什么能死锁的程序还能和谐的运行?这个锁在同步代码究竟是怎么工作的?求解。。
作者: Nero    时间: 2013-9-2 01:12
应该和CPU有关系,
我的U是A10 5800k 运行了这个死锁Demo  一直被和谐 从未被锁死,
死锁和机器的配置和CPU的使用率也有关系
死锁的时候cpu的使用率应该是很高的
从这看,当初毕老师的笔记本应该已经“朽”了!!!
作者: 兜兜转转    时间: 2013-9-2 05:16
死锁,我的成功了,直接就停住了,只要你特地写的死锁代码,按道理死锁是很容易就发生的啊
作者: 梦想蓝色天空    时间: 2013-9-2 10:40
我的貌似也没有锁住{:soso_e101:}  写了好几层
作者: 吴光新    时间: 2013-9-2 11:43
多运行,当初我的也没锁住,还以为是代码问题!只要你代码没错,肯定会锁住的
作者: 影响力147753321    时间: 2013-9-2 13:42
死锁不一定发生,但是发生了死锁,程序一定玩完。所谓死锁就是二个线程都持有一个对象锁,同时又要去拿对方的锁。这种时就可能发生死锁。因为很可能双方持有的锁都不放,使双方都无法拿到其锁。就好比二个人都要进入a,b二个屋。一人有a屋的钥匙,一个有b屋的钥匙。如果二个商量好,一个进入a 屋后,把钥匙交给另外一个人,另一个进入b屋后,也把钥匙交给对方。这样就和谐了。不过这是理想情况。现实中很多是互不相让。这就会使二个互相等待。线程的原理类似,因为是cpu是随机选择的,这就很可能使对方线程都是拿不到对方的锁而造成死锁。要写一个死锁程序不一定好使,但程序一旦发生死锁,程序就没什么价值,所以在写程序时一定要避免死锁。尽量避免线程访问共享资源。不要使锁嵌使用。

作者: 罗凯健    时间: 2013-9-2 16:14
影响力147753321 发表于 2013-9-2 13:42
死锁不一定发生,但是发生了死锁,程序一定玩完。所谓死锁就是二个线程都持有一个对象锁,同时又要去拿对方 ...

终于有人答道点子上了。不过我就是不太明白,假如1线程持有A锁,2线程持有B锁,那应该是会死锁的。但是为什么会出现和谐的情况,能说一下吗?
是因为1线程持有A锁,2线程也持有A锁?这个锁是怎么交换的?

作者: 影响力147753321    时间: 2013-9-2 17:01
锁怎么交换?就是a用完了让出,b正好抢到,a也正好抢到a的锁。这样好吧。跟商量好似的,也可以多次各谐,你说的1线程持有A锁,2线程也持有A锁,i不对,一个线程只持有一个对象锁。其它线程只有等待。

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





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