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

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