死锁
所谓死锁是指两个或两个以上的进程在执行过程中因争夺资源而相互等待的现象;如果没有外力作用,他们则无法推进下去。
产生死锁的原因
-
因为系统资源不足
-
进程运行推进的顺序不合适
-
资源分配不当等
产生死锁的必要条件
-
互斥条件
-
请求和保持条件
-
不剥夺条件
-
环路等待条件
package com.tiger.deadLock;
import java.util.concurrent.TimeUnit;
/**
* 死锁
* @author tiger
* @Date 2017年7月27日
*/
public class DeadLock {
public static void main(String[] args) {
Park task = new Park();
// 章鱼线程
Thread th1 = new Thread(task,"章鱼");
// 光头线程
Thread th2 = new Thread(task,"光头");
th1.start();
th2.start();
}
}
class Park implements Runnable{
//两人共同拥有相同的两把锁
String[] locks = {"0","1"};
@Override
public void run() {
String name = Thread.currentThread().getName();
switch( name ){
//光头用 0 号卡进尖叫地带"。
case "光头":尖叫地带( locks[0] ); break;
//章鱼用 1 号卡进海底世界"。
case "章鱼":海底世界( locks[1] );break;
}
}
/**
* 光头:持0号卡进外围的尖叫地带,玩一阵子后,想持另外一张卡(1号卡)进恐怖森林,但此时0号卡被占用。
* @param card
*/
public void 尖叫地带(String card){
String name = Thread.currentThread().getName();
//card 1 先进尖叫地带
synchronized (card) {
System.out.println(name+" 进到尖叫地带");
//进去玩耍2秒
try {TimeUnit.SECONDS.sleep(3);}
catch (InterruptedException e) {}
/*在外围玩耍完后,想进一步进到恐怖森林时,
手头只有1号卡可以使用,此时1号卡被其他人(线程)持有还没有释放,
因此进不了,只能在外头干等,此时另外一个人也是这种情况,所以造成死锁。*/
System.out.println(name+" 准备进到恐怖盛林");
synchronized (locks[1]) {
System.out.println(name+" 进到恐怖盛林");
}
}
}
/**
* 章鱼:持1号卡进外围的海底世界,玩一阵子后,想持另外一张卡(0号卡)进东海龙宫,但此时0号卡被占用。
* @param card
*/
public void 海底世界(String card){
String name = Thread.currentThread().getName();
// 持1号卡先进海底世界
synchronized (card) {
System.out.println(name+" 进到海底世界");
// 进去玩耍2秒
try {TimeUnit.SECONDS.sleep(3);}
catch (InterruptedException e) {}
/*在外围玩耍完后,想进一步进到东海龙宫时,
手头只有0号卡可以使用,此时0号卡被其他人(线程)持有还没有释放,
因此进不了,只能在外头干等,此时另外一个人也是这种情况,所以造成死锁。*/
System.out.println(name+" 准备进到东海龙宫");
synchronized (locks[0]) {
System.out.println(name+" 进到东海龙宫");
}
}
}
}