线程0在flag为true时进入循环,获得锁的过程就是:obj-->this-->obj,obj和obj是同一个锁,所以线程0想要执行下去,就要先获得obj锁,然后获得this锁。
线程1在flag为false的时候进入循环,获得锁的过程是:this-->obj,所以线程1想要执行下去,就要先获得this锁,然后获得obj锁。
这里假设,线程0在获得obj锁后,还没有执行下一句,CPU就切换了,所以线程0拿到了obj的锁。
轮到线程1执行,线程1执行首先就要拿到this锁,this没有被锁定,所以可以继续执行,然后在线程1执行下一句的时候,需要拿到obj的锁,但是obj已经被线程0锁定,无法继续执行下去了。
CPU只有切换到线程0,让线程0来继续执行,但是此时线程0执行下一句就要用到this锁,this锁被线程1锁定了。线程0也无法执行了,这样就成了死锁。更详细的解释:
//代码一
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];