第十九讲 多线程(四)——死锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yerenyuan_pku/article/details/82670716

死锁的概述

死锁就是指同步中嵌套同步。

死锁的案例

以卖票程序为例来演示死锁情况。

class SaleTicket implements Runnable
{
    private int tickets = 1000;
    //定义一个boolean标记。
    boolean flag = true;
    Object obj = new Object();
    public void run()
    {
        if (flag)
            while (true)
            {
                synchronized (obj)//obj lock
                {
                    sale();//this lock
                }
            }
        else
            while (true)
                sale();
    }

    public synchronized void sale()//this lock
    {
        synchronized (obj)//obj lock
        {
            if (tickets > 0)
            {
                try {Thread.sleep(10);} catch (InterruptedException e) {}//让线程到这里稍微停一下。
                System.out.println(Thread.currentThread().getName() + "....func...." + tickets--);
            }
        }

    }
}

class DeadLockDemo 
{
    public static void main(String[] args) throws InterruptedException
    {
        //线程任务对象。
        SaleTicket t = new SaleTicket();

        //创建四个线程。通过Thread类的对象。
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        t1.start();

        Thread.sleep(10);//让主线程睡10s,此刻能运行的线程只有t1
        t.flag = false;
        //主线程醒了之后,t1和t2线程同时运行
        t2.start();
    }
}

面试题:写一个死锁程序

这里有一个面试题,写一个死锁程序。如果你能写出来,说明你对多线程这门技术多少有一些了解了。为方便大家参考,下面我给出一个死锁示例。

class Task implements Runnable
{
    private boolean flag;
    Task(boolean flag)
    {
        this.flag = flag;
    }
    public void run()
    {
        if (flag)
        {
            while (true)
                synchronized (MyLock.LOCKA)
                {
                    System.out.println("if......locka");
                    synchronized (MyLock.LOCKB)
                    {
                        System.out.println("if......lockb");
                    }
                }
        }
        else
        {
            while (true)
                synchronized (MyLock.LOCKB)
                {
                    System.out.println("else......lockb");
                    synchronized (MyLock.LOCKA)
                    {
                        System.out.println("else......locka");
                    }
                }
        }
    }
}

class MyLock
{
    public static final Object LOCKA = new Object();
    public static final Object LOCKB = new Object();
}

class DeadLockTest 
{
    public static void main(String[] args) 
    {
        //创建线程任务
        Task t1 = new Task(true);
        Task t2 = new Task(false);

        new Thread(t1).start();
        new Thread(t2).start();
    }
}

猜你喜欢

转载自blog.csdn.net/yerenyuan_pku/article/details/82670716
今日推荐