当我开启了两个线程去访问共享数据时候,我在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才会出现错误,大家有没有对这个死锁理解比较透彻的帮忙解答下疑惑,谢谢啦 |