因为Object locka = new Object() ,lockb = new Object(); 加上static修饰以后,locka 和lockb变
成静态。
由于static 的变量所有的调用都是同一块内存(同一个进程),所以两个线程所需要的
变量是一样的,那么这两个变量学名上是临介资源,一次只能给一个进程服务;
当线程1运行时,需要locka 变量,此时他取得locka 变量然后sleep一段时间 ,之后在线程
1sleep这段时间,线程2取得变量lockb,然后sleep一段时间 ,线程1sleep结束后,申请
变量lockb,由于线程2正控制变量lockb,所以线程1无法取得,此时线程1等待线程2释放变
量lockb,线程1等待时未释放变量locka ,线程2sleep结束后,申请变量locka ,由于线程1正
控制变量locka ,所以线程2无法取得,此时线程2等待线程1释放变量locka ,线程2等待时未释
放变量lockb ,死锁出现了,两者都需要两个变量,而手里只有一个,等另一个,在手
的又不放,则不会有一个线程能执行下去,两个就永远的这么死下去;如没有两个
static变量,就不存在资源的抢夺,出现不了死锁;死锁必须存在一个以上的临介资源 |