1、 什么是死锁
多个线程各自占有一些资源,并相互等待其他线程占有的资源 才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。 一个同步块,同时拥有"两个以上对象的锁 ",就可能会发生”死锁“的问题。
化妆例子
public class DeadLock {
public static void main ( String[ ] args) {
Thread t1 = new MakeUp ( 0 , "灰姑娘" ) ;
Thread t2 = new MakeUp ( 1 , "白雪公主" ) ;
t1. start ( ) ;
t2. start ( ) ;
}
}
class LipStick {
}
class Mirror {
}
class MakeUp extends Thread {
static Mirror mirror = new Mirror ( ) ;
static LipStick lipStick = new LipStick ( ) ;
int choice;
String name;
public MakeUp ( int choice, String name) {
this . choice = choice;
this . name= name;
}
@Override
public void run ( ) {
try {
makeup ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
}
public void makeup ( ) throws InterruptedException {
if ( choice== 0 ) {
synchronized ( lipStick) {
System. out. println ( name+ "使用口红" ) ;
Thread. sleep ( 1000 ) ;
synchronized ( mirror) {
System. out. println ( name+ "使用镜子" ) ;
}
}
} else {
synchronized ( mirror) {
System. out. println ( name+ "使用镜子" ) ;
Thread. sleep ( 1000 ) ;
synchronized ( lipStick) {
System. out. println ( name+ "使用口红" ) ;
}
}
}
}
}
白雪公主使用镜子
灰姑娘使用口红
2、产生死锁的条件
互斥条件
请求与保持条件
一个进程因请求资源而阻塞时,对已获得的资源保持不放 不剥夺条件
循环等待条件
只要:破坏其中任意一个或者多个必要条件,就可以避免死锁的发生。
例子修正
public void makeup ( ) throws InterruptedException {
if ( choice== 0 ) {
synchronized ( lipStick) {
System. out. println ( name+ "使用口红" ) ;
Thread. sleep ( 1000 ) ;
}
synchronized ( mirror) {
System. out. println ( name+ "使用镜子" ) ;
}
} else {
synchronized ( mirror) {
System. out. println ( name+ "使用镜子" ) ;
Thread. sleep ( 1000 ) ;
}
synchronized ( lipStick) {
System. out. println ( name+ "使用口红" ) ;
}
}
}
白雪公主使用镜子
灰姑娘使用口红
白雪公主使用口红
灰姑娘使用镜子