A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zztierlie 中级黑马   /  2016-8-16 12:16  /  1015 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程这个东西好难啊

9 个回复

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

评分

参与人数 1黑马币 +3 收起 理由
r1503882525 + 3 回答认真

查看全部评分

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

谢谢句句,懂了
回复 使用道具 举报

为了刷技术分我也是豁出去了
回复 使用道具 举报
要的就是这种豁出去的精神
回复 使用道具 举报
赞一个.
回复 使用道具 举报
在基础课程里线程,JDBC有点复杂,多练习,
回复 使用道具 举报
了解锁的机制,明白什么是乐观锁或者拍他锁
回复 使用道具 举报
哈韩浪子 发表于 2016-8-18 10:26
了解锁的机制,明白什么是乐观锁或者拍他锁

谢谢大神的指点
回复 使用道具 举报

可以具体业务了解,我在项目中遇到过死锁。最后数据库的session 没了,就挂掉了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马