死锁发生在同步代码块嵌套使用时,比如一下场景:
第一条线程内
synchronized(T1.class/*钥匙1*/) {
synchronized(T2.class/*钥匙2*/){
...................................................
需要运行的语句
.....................................................
}
}
第二条线程内
synchronized(T2.class/*钥匙2*/) {
synchronized(T1.class/*钥匙1*/){
...................................................
需要运行的语句
.....................................................
}
}
为什么会产生死锁呢?
通俗的说法:你家和隔壁家都有两扇门,一道木门,一道防盗门(在线程里两个synchronize的功能是一样的,没有这个区别,这里只是比喻,方便说明顺序),
你和邻居家装门的顺序是反的,你家木门在外,防盗门在里,邻居家相反,你和你的邻居都需要两把钥匙来开门,如果你速度快,在邻居没反应过来之
前拿到第一把钥匙开门之后立即拿到二把钥匙,那么就不会卡住,但如果你拿到第一把钥匙开门后,发现第二把钥匙被邻居拿走开门了,那么你和你
邻居就谁都进不了家了,因为你和你的邻居都只会在两扇门都打开的时候才会把钥匙还回去,这个时候的情况就叫做死锁,但第一种不会卡住的情况在程序中是无法实现的,线程的切换是随机的,你可能一下不会被卡住,但你终究会被卡住的
|