黑马程序员技术交流社区

标题: 产生死锁的原因 [打印本页]

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

作者: zztierlie    时间: 2016-8-17 15:33
彭鸿儒 发表于 2016-8-16 15:05
死锁发生在同步代码块嵌套使用时,比如一下场景:
第一条线程内
    synchronized(T1.class/*钥匙1*/) {

谢谢句句,懂了
作者: 彭鸿儒    时间: 2016-8-17 20:28
zztierlie 发表于 2016-8-17 15:33
谢谢句句,懂了

为了刷技术分我也是豁出去了
作者: wyq0627java11    时间: 2016-8-17 21:37
要的就是这种豁出去的精神
作者: 695212308    时间: 2016-8-17 22:07
赞一个.
作者: 爱你一万年    时间: 2016-8-18 10:23
在基础课程里线程,JDBC有点复杂,多练习,
作者: 哈韩浪子    时间: 2016-8-18 10:26
了解锁的机制,明白什么是乐观锁或者拍他锁
作者: zztierlie    时间: 2016-8-19 11:04
哈韩浪子 发表于 2016-8-18 10:26
了解锁的机制,明白什么是乐观锁或者拍他锁

谢谢大神的指点
作者: 哈韩浪子    时间: 2016-8-19 13:28
zztierlie 发表于 2016-8-19 11:04
谢谢大神的指点

可以具体业务了解,我在项目中遇到过死锁。最后数据库的session 没了,就挂掉了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2