黑马程序员技术交流社区

标题: 多线程的死锁问题 [打印本页]

作者: kevinmesss.tz    时间: 2014-2-19 19:47
标题: 多线程的死锁问题
本帖最后由 kevinmesss.tz 于 2014-2-23 00:07 编辑

图中代码是毕老师多线程视频里面讲死锁的
这里有几个弯转不过来
API里面写着public Thread(Runnble target) target指的是run()方法被调用的对象
那么代码中
DeadLockTest dlt1 = new DeadLockTest(true) ;
DeadLockTest dlt2 = new DeadLockTest(false) ;
new Thread(dlt1).start() ;
new Thread(dlt2).start() ;
两个线程传入的不是同一个对象,调用的应该不是同一个run()方法吧?
那为什么还会造成死锁?

ThreadDeadLock.png (116.16 KB, 下载次数: 35)

ThreadDeadLock.png

作者: 灰太狼爱平底锅1    时间: 2014-2-19 20:22
虽然线程中传入的不是同一对象,但run()方法中synchronized中传入的锁a与b是静态的,是由两个线程共享的,因此才会发生争抢导致死锁。
作者: centian2005    时间: 2014-2-19 20:38
那为什么还会造成死锁?
先说说操作系统中关于死锁的解释:所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
在来说你帖子中的问题,楼上那位给出解释了。建议LZ有空之余,也看看关于计算机组成,操作系统和网络方面的基础知识,这对你日后理解编程语言,也会有不小的帮助
作者: kevinmesss.tz    时间: 2014-2-19 21:17
灰太狼爱平底锅1 发表于 2014-2-19 20:22
虽然线程中传入的不是同一对象,但run()方法中synchronized中传入的锁a与b是静态的,是由两个线程共享的, ...

虽然还是不理解
但是,谢谢指点!
作者: kevinmesss.tz    时间: 2014-2-19 21:18
centian2005 发表于 2014-2-19 20:38
那为什么还会造成死锁?
先说说操作系统中关于死锁的解释:所谓死锁(Deadlock),是指多个进程在运行过程中 ...

谢谢你的建议!
作者: 夏新¤Amoi    时间: 2014-2-19 23:34
我的理解是:以字符串为锁的话,线程1创建了“a”和“b”,如果线程1没有结束,那么线程2就用到已经有的字符串,也就是用到线程1的锁。
作者: 罗安迪    时间: 2014-2-20 10:35
kevinmesss.tz 发表于 2014-2-19 21:17
虽然还是不理解
但是,谢谢指点!

就是有资源是被线程共同可以获取的,那么意味着假如老公在一个银行为a账户存钱100(账户原来没钱),老婆同时在在另外个银行从a账户取钱,那个a账户就是线程中可以共同获取的,于是假如老公先进入账户存好钱,马上老婆就去取,因为银行存钱进入账户需要时间,所以老婆取不到,这就发生错误了,老婆回去肯定会骂老公。。。社会就不和谐了。。。
作者: 罗安迪    时间: 2014-2-20 10:40
罗安迪 发表于 2014-2-20 10:35
就是有资源是被线程共同可以获取的,那么意味着假如老公在一个银行为a账户存钱100(账户原来没钱),老婆 ...

啊。。。偏题了。。。
这现象就是死锁了
假如有锁,那么老公进入账户且存好钱进入账户之前老婆就没办法进入账户,存好钱且账户上出现钱后老公才把锁打开把账户放开老婆才能进去看到且取到钱。大吉。
作者: 罗安迪    时间: 2014-2-20 10:41
罗安迪 发表于 2014-2-20 10:35
就是有资源是被线程共同可以获取的,那么意味着假如老公在一个银行为a账户存钱100(账户原来没钱),老婆 ...

啊。。。偏题了。。。
这现象就是死锁了
假如有锁,那么老公进入账户且存好钱进入账户之前老婆就没办法进入账户,存好钱且账户上出现钱后老公才把锁打开把账户放开老婆才能进去看到且取到钱。大吉。
作者: 罗安迪    时间: 2014-2-20 15:15
罗安迪 发表于 2014-2-20 10:41
啊。。。偏题了。。。
这现象就是死锁了
假如有锁,那么老公进入账户且存好钱进入账户之前老婆就没办法进 ...

。。。回答错问题了

应该是,老公有密码 老婆有卡 于是老公存不了钱 老婆取不了钱 这是死锁。
作者: elq7xy    时间: 2014-2-22 22:18
所谓死锁,是指两个以上的进程互相都要求对方已经占有的资源导致无法继续运行下去的现象。
进程推进顺序不当,同类资源分配不当,PV操作使用不当都是死锁。
死锁产生的原因及4个必要条件:互斥条件,请求保持条件,不可剥夺条件和环路条件。
死锁的处理有4种:不理睬,预防,避免和检测与解除。
进程为dlt1和dlt2,资源为a和b,2个进程与两个资源形成了环路。
作者: elq7xy    时间: 2014-2-22 22:20
技术分啊~~技术分= =




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