Java多线程死锁的问题

classTicketimplementsRunnable{privateinttick=100;Objectobj=newObject();booleanflag=tr... class Ticket implements Runnable

{
private int tick = 100;
Object obj = new Object();
boolean flag = true;

public void run(){
if(flag){
while(true){
synchronized(obj){ //obj锁
show();
}
}
}else{
while(true)
show();
}
}

public synchronized void show(){ //this锁
synchronized(obj){ //obj锁
if(tick>0){
try{
Thread.sleep(10);
}catch(Exception e){

}
System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
}
}
}
}

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();
}
}

我想问一下,什么情况下是this锁,函数上的锁就一定是this锁是么?代码块的锁呢?
另外上面的程序会出现死锁,为什么?t1和t2都在调用show(),那t1执行show的时候t2应该执行不了啊,锁应该锁上了啊,怎么会出现死锁呢?
本人菜鸟,线程同步这个地方学的很吃力,希望讲解的能详细一点
展开
 我来答
artintin
2014-03-02 · TA获得超过1.2万个赞
知道大有可为答主
回答量:7508
采纳率:80%
帮助的人:2886万
展开全部
代码已修改,可能出现的问题,(1)sleep时间过短,线程2还没启动,票已卖完
(2)两个while是死循环,票卖完了没退出
(3)死锁的原因怀疑是两个Obj锁的冲突,可能是两个线程各拿到一个锁,均没有解锁机制,所以我删除了show方法中的obj锁
class Ticket implements Runnable
{


  Object obj = new Object();
  boolean flag = true;


         {
  while(tick>0)
  {
    synchronized(obj) //obj锁
    {           
    show();
    }
  }
 }
 else
 {
   while(tick>0)show();
         }
      }

      public synchronized void show(){    //this锁
          if(tick>0){
                try{
                    Thread.sleep(100);
                }catch(Exception e){

            }
            System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
           
        }
    }
}

public 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();
    }
}
更多追问追答
追问
?。。我不是让你解决掉死锁。。我是问为什么会出现死锁- -
追答
已修改,你看看
旅春冬TJ
2014-03-02 · TA获得超过1082个赞
知道大有可为答主
回答量:1271
采纳率:66%
帮助的人:507万
展开全部

其实说实话你用了很多重的锁,以至于根本不知道哪里死锁,同步标志你用了数次,synchronized这个关键字一般是叫做同步块,也就是在这个关键字里面的方法或者代码块只能每次有一个线程进入,实在不了解你所说的this锁,一般情况下加锁有额外的语句,上边的关键字一般用于同步,请看java编程思想的多线程章节。

package test;
class Ticket implements Runnable

{
    private int tick = 100;
    Object obj = new Object();
    boolean flag = true;

    public void run(){
        if(flag){
            while(true){
                //synchronized(Ticket.this){            //obj锁
                    show();
               // }
            }
        }else{
            while(true)
                show();
        }
    }

    public synchronized 
    void show(){    //this锁
       // synchronized(obj){                       //obj锁
            if(tick>0){
                try{
                    Thread.sleep(10);
                }catch(Exception e){

            }
            System.out.println(Thread.currentThread().getName()+"code.........:"+tick--);
          //  }
        }
    }
}

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();
    }
}
追问
已经明白了,谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月光雪松
2014-03-02 · TA获得超过476个赞
知道小有建树答主
回答量:338
采纳率:100%
帮助的人:234万
展开全部
已经测试过,上面的代码不会发生死锁。所以你的问题还是重新问吧
再试一遍,居然又死锁了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式