死锁代码演示

死锁

所谓死锁是指两个或两个以上的进程在执行过程中因争夺资源而相互等待的现象;如果没有外力作用,他们则无法推进下去。

产生死锁的原因

  1. 因为系统资源不足

  2. 进程运行推进的顺序不合适

  3. 资源分配不当等

产生死锁的必要条件

  1. 互斥条件

  2. 请求和保持条件

  3. 不剥夺条件

  4. 环路等待条件

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+" 进到东海龙宫");
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ljt-tiger

thanks

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值