写一个死锁示例,创建两个线程的代码看不出什么问题但是在命令行运行时只输出了一个线程是怎么回事?
 class Ticket implements Runnable
{
    private int num=100;
    Object obj=new Object();
    boolean flag=true;
    public void run()
    {
        if (flag)
        {
            while (true)
            {
                synchronized(obj)//同步代码块中的是同步函数
                {
                    show();//它的锁其实是this
                }
            }
        }
        else
            while(true)
                this.show();
    }
    public synchronized void show()//同步函数中加入同步代码块且它的锁是obj
    {
        synchronized(obj)
        {
            if (num>0)
            {
                try{Thread.sleep(10);}catch(InterruptedException e){}
                System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
            }
        }
    }
}
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(InterruptedException e){}
        t.flag=false;
        t2.start();
    }
}

1个回答

 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(InterruptedException e){}
        t.flag=false;  //这个修改对线程内不同步,不生效。所以先锁obj,再锁show,不会出现死锁
        t2.start();
    }
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问