Java-多线程(四)死锁

2018-07-18  本文已影响3人  码农随想录

死锁

同步的另一个弊端:

情况之一:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。
这时容易引发一种现象:死锁。
这种情况能避免就避免掉。

//Thread-0
synchronized(obj1)
{
    -->thread-0  obj1
    synchronized(obj2)
    {
    }
}
//Thread-1
synchronized(obj2)
{
    Thread-1 obj2
    synchronized(obj1)
    {   
    }
}

死锁示例

class Test implements Runnable
{
    private boolean flag;
    Test(boolean flag)
    {
        this.flag = flag;
    }

    public void run()
    {
        if(flag)
        {
            while(true)
            {
                synchronized(MyLock.LOCKA)
                {
                    System.out.println(Thread.currentThread().getName()+"...if......locka");
                    synchronized(MyLock.LOCKB)
                    {
                        System.out.println(Thread.currentThread().getName()+"...if......lockb");
                    }
                }
            }
        }
        else
        {
            while(true)
            {
                synchronized(MyLock.LOCKB)
                {
                    System.out.println(Thread.currentThread().getName()+"...else......lockb");
                    synchronized(MyLock.LOCKA)
                    {
                        System.out.println(Thread.currentThread().getName()+"...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) 
    {
        //创建两个线程任务。
        Test t1 = new Test(true);
        Test t2 = new Test(false);
        
        Thread t11 = new Thread(t1);
        Thread t22 = new Thread(t2);
        t11.start();
        t22.start();

    }
}
上一篇下一篇

猜你喜欢

热点阅读