java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。

线程死锁产生的条件:

  • 当两个线程相互调用Join()方法。
  • 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁

下面看代码:

代码1:死锁的案例

package com.lp.ecjtu.Thread;


/*
死锁:常见情景之一:同步的嵌套。

*/
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();
                }
            }
        else
            while(true)
                this.show();
    }

    public synchronized void show()//同步函数里面的调用同步代码块
    {

        synchronized(obj)
        {
            if(num>0)
            {
                try{Thread.sleep(10);}catch (InterruptedException e){}
                
                System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
            }
        }
    }
}


public class DeathLockThread1 
{
    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();
    }
}

代码2:

 

package com.lp.ecjtu.Thread;

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

    @Override
    public void run() {
        if(flag){
            synchronized (Lock.mylock1){
                System.out.println("if mylock1"+Thread.currentThread().getName());
                synchronized (Lock.mylock2){
                    System.out.println("if mylock2"+Thread.currentThread().getName());
                }
            }
        }else{
            synchronized (Lock.mylock2){
                System.out.println("else mylock2"+Thread.currentThread().getName());
                synchronized (Lock.mylock1){
                    System.out.println("else mylock1"+Thread.currentThread().getName());
                }
            }
        }
    }

}
 
 class Lock{
    static Object mylock1 = new Object();
    static Object mylock2 = new Object();
 }
 
 public class DeathLockThread{
     public static void main(String[] args){
         Thread t1 = new Thread(new DeathLockRunable(true));
         Thread t2 = new Thread(new DeathLockRunable(false));
         t1.start();
         t2.start();
     }
 }

输出结果:if mylock1Thread-0
else mylock2Thread-1


 

 
posted @ 2014-08-09 11:20  积淀  阅读(203)  评论(0编辑  收藏  举报