美文网首页
Java-多线程(四)死锁

Java-多线程(四)死锁

作者: 码农随想录 | 来源:发表于2018-07-18 10:49 被阅读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();
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Java-多线程(四)死锁

          本文链接:https://www.haomeiwen.com/subject/omfopftx.html