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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wygsqsj 中级黑马   /  2015-8-15 22:45  /  823 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当我开启了两个线程去访问共享数据时候,我在run方法中加入了同步代码块来防止多线程出现安全问题,当线程1在执行时获取了obj的锁,如果这个时候cpu切到了线程2,那么这个线程1是不是先释放obj锁,线程2才能拿到,那么在后续的死锁中,线程1持有obj和this两个锁,当cpu切到线程2时候线程1要抛弃这两个锁,问题是当线程2拿到了this锁,而线程1没有抛obj锁的时候他们产生了死锁,这不科学啊,为什么线程2不能等待线程1把obj锁抛弃之后再去执行?
备注:这个问题是在毕老师死锁的视频中我不理解的地方,其中我自己也有知识点的模糊,比如cpu切换到线程2时,线程1有没有抛弃当前的锁,我感觉他们共用的是一个run方法,如果没有抛弃,那么线程二只能是又拿到一个当前锁,可是这是不合理的,因为run方法只有一个。
还有我试了一下在线程1拿到obj锁后接着sleep,这个时候他不会去拿this锁,但是sleep方法不会抛弃锁,wait才会,而这个时候线程2开始执行,他去拿this锁,然后拿obj锁,但是obj在被线程1抱着睡觉,这个时候我感觉才是真正的死锁,这个时候程序是没有显示的,而毕老师讲的线程1在执行时被cpu切换到线程2,线程2抛弃锁的时候产生了死锁让我不理解,而且还有抛弃的先后问题也没有讲清楚,如果是因为线程1抛了一个锁后还没来的及抛另一个锁而导致死锁那么线程1应该先抛this再抛obj才会出现错误,大家有没有对这个死锁理解比较透彻的帮忙解答下疑惑,谢谢啦

4 个回复

倒序浏览
巧克黑力 来自手机 中级黑马 2015-8-15 23:06:58
沙发
本来看懂的,看你说的,又蒙了,我记得两个线程,四个同步,每个站着对方的,互相不释放,就死了!
回复 使用道具 举报
wygsqsj 来自手机 中级黑马 2015-8-16 10:21:42
藤椅
恩,其实是挺纠结的,不过我还是喜欢刨根问底,现在终于有点眉目了,当时我纠结的地方在于是在抛锁的时候产生了死锁这不合理,其实真的是不合理,毕姥爷第一次讲的时候把我带进了一个误区,他也觉得不合理于是又换了种说法,经过实验我得出了这么一个结论,就是抛锁的时候是不可能产生死锁的,那时候他做的只有等待,产生死锁的原因是在拿锁的时候冲突了,这个时候我纠结的第二个问题就来了,当线程切换的时候他应该抛弃当前锁啊,为什么还会死锁呢,这个想法来自一个锁的时候,只有一个线程释放了当前锁另一个线程才能得到并运行共享资源,但是这个地方有一个注意点,正是这个点导致了死锁,那就是嵌套
回复 使用道具 举报
wygsqsj 来自手机 中级黑马 2015-8-16 10:23:32
板凳
接上页
嵌套式的锁有一个运行长度,当
回复 使用道具 举报
wygsqsj 来自手机 中级黑马 2015-8-16 10:40:56
报纸
线程1拿到了第一个锁obj的时候,理想状态他要拿第二个锁this,但是这个时候精彩的就来了,当线程1拿到了obj锁,正想往下执行的时候,线程2过来抢了他的执行权,线程1非常气愤,劳资还没执行完,你就来抢生意,他就不放obj了,原因就在这,线程1在拿到第一个锁obj的时候被抢了执行权,他是不会抛弃obj的锁,而这个时候线程2抢到了执行权,正Sb呵呵的往下执行,线程2是可以拿到this锁的,但是在this锁里面还有第二道锁obj,而线程1正抱着obj锁哭呢,线程2颠呵呵的跟线程1要锁,线程1一看,cao,这不抢我执行权那家伙,于是
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马