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

本帖最后由 刘源 于 2012-7-11 17:48 编辑

今天练习写死锁,发现一个BUG。大家都是看的毕老师的死锁视频把,多余的程序我就不写了。就这点不一样.
class DeadLockDemo
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();
                Thread t1=new Thread(t);
                Thread t2= new Thread(t);
                t1.start();
                //try{Thread.sleep(10);}catch(Exception e){}
                t.flag = false;
                t2.start();
        }
}

就红色的那句话,特别有意思,为什么我加了这句话之后10次基本上9次都会出显死锁。而把这句话去掉了之后,10次中到现在一次死锁都没有发生呢,难度死锁程序还和它有关系吗?

去掉这句话之后线程1和2还是交替有运行。并不是一直就一个线程运行,而且我的基数也是1000,希望知道的大神们解答下。其他同学也希望你们试下,看看是不是我这机器出问题了。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
楼主,Thread.sleep()方法是让当前线程挂起一段时间,你这里总共有三个线程:主线程,t1,t2。现在我们假设最先抢到cup资源的是t1,可能t1抢到资源但是还没有执行代码时,直接就sleep了;这时t2抢到了资源,同样还没来得及执行就直接挂起了;这时就只剩下主线程,主线程只执行了几下也很悲惨地被挂起了。这个程序的所有线程全部被挂起,因此就出现了死锁了。cup的处理速度非常快,你sleep了10毫秒,十次有八九就会出现死锁,如果楼主把秒数改为0的话,就可以看到各个线程抢占cup资源的情况了。
回复 使用道具 举报
首先你这段代码的顺序是主线程先启动线程1,然后主线程睡了10毫秒,然后主线程把标记改成了flase,然后主线程把线程2启动。你不加这句话线程1和2的交替执行可能是因为你的两个同步(代码块或函数)用的不是同一个锁。把你全部代码发上来看看呗
回复 使用道具 举报
我是看的张老师的视频,讲到死锁跟你这里代码差不多,情况是这样的:在程序开始运行的时候,先执行t1.start(),只是将t1线程激活,并不会直接运行t1,然后执行主线程下面的程序,遇到sleep过后,主线程先挂起,然后返回t1运行,这里的t1里面的判定语句就是执行的 t.flag = true了,然后当sleep时间到了过后就继续执行主线程后面的程序,t2中的判断语句就是 t.flag = false了。如果说去掉sleep的话,程序就会在激活t1线程后继续下面的代码   t.flag = false; 并且激活t2,然后再执行t1和t2的线程,这个时候t1和t2中的线程的判断对象就都是t.flag = false了,就当然死不了了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马