栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程死锁的发生与解决

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程死锁的发生与解决

线程死锁

在这里写一个线程死锁的例子:
郭老板和黄老板都想喝啤酒,喝啤酒一共需要两个物件,杯子和啤酒,这里分别对杯子和啤酒都上锁,例子中郭老板和黄老板都需要同时拿到两个物件后才能喝到酒。这里为了防止线程运行速度过快郭老板或黄老板喝酒的动作一下执行而产生不了死锁,在他们拿到其中一个物件后设置了线程休眠,这样就可以模拟发生死锁。
产生死锁的条件:两个线程都同时需要对方的资源,并且未完成前都不释放当前占有的资源。

package test.thread2;

public class DeadLock {

	public static void main(String[] args) {
		Drink d1 = new Drink(0,"郭老板");
		Drink d2 = new Drink(2,"黄老板");
		
		d1.start();
		d2.start();
	}
	
}
class Beer{
	
}
class Cup{
	
}
class Drink extends Thread{
	private static Beer beer = new Beer();
	private static Cup cup = new Cup();;
	private int choice;
	private String name;

	public  Drink(int choice,String name) {
		this.choice = choice;
		this.name = name;
	}
	public void run() {
		try {
			drink(choice, name);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void drink(int choice,String name) throws InterruptedException {
		// TODO Auto-generated method stub
		if(choice==0) {
			synchronized (beer) {//需要同时获得杯子和啤酒
				System.out.println(name+"拿到了啤酒");
				Thread.sleep(1000);				
				synchronized (cup) {
					System.out.println(name+"拿到了杯子");
				}
			}
			System.out.println(name+"端起杯子喝啤酒");
			
		}else {//需要同时获得杯子和啤酒
			synchronized (cup) {
				System.out.println(name+"拿到了杯子");
				Thread.sleep(1000);
				synchronized (beer) {
					System.out.println(name+"拿到了啤酒");
				}
			}
			System.out.println(name+" 端起杯子倒啤酒");
		}
	}
}


黄老板和郭老板只能拿到所需资源的一部分,并且不喝到酒就不释放资源。
产生死锁的条件:两个线程都同时需要对方的资源,并且未完成前都不释放当前占有的资源。

package test.thread2;

public class DeadLock {

	public static void main(String[] args) {
		Drink d1 = new Drink(0,"郭老板");
		Drink d2 = new Drink(2,"黄老板");
		
		d1.start();
		d2.start();
	}
	
}
class Beer{
	
}
class Cup{
	
}
class Drink extends Thread{
	private static Beer beer = new Beer();
	private static Cup cup = new Cup();;
	private int choice;
	private String name;

	public  Drink(int choice,String name) {
		this.choice = choice;
		this.name = name;
	}
	public void run() {
		try {
			drink(choice, name);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private void drink(int choice,String name) throws InterruptedException {
		// TODO Auto-generated method stub
		if(choice==0) {
			synchronized (beer) {//需要同时获得杯子和啤酒
				System.out.println(name+"拿到了啤酒");
				Thread.sleep(1000);				
			}
			synchronized (cup) {
				System.out.println(name+"拿到了杯子");
			}
			System.out.println(name+"端起杯子喝啤酒");
			
		}else {//需要同时获得杯子和啤酒
			synchronized (cup) {
				System.out.println(name+"拿到了杯子");
				Thread.sleep(1000);
				synchronized (beer) {
					System.out.println(name+"拿到了啤酒");
				}
			}
			System.out.println(name+" 端起杯子倒啤酒");
		}
	}
}


解决死锁的办法:只有其中一个人不需要同时占有两个资源,死锁就不发生,两个人最后都能喝到酒。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458605.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号