死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。
线程死锁产生的条件:
- 当两个线程相互调用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
java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
时间: 2024-10-05 04:58:50