关于“死锁”,这样理解对吗?求高人解答。

逸花城 2016-07-18 10:46:40
关于“死锁”,书上有个例子,但我觉得不够充分,于是小改了一下,这样的思路正确不?运行结果是一样的。

class ZhangSan
{
public void say(){
System.out.println("张三对李四说:“你给我画,我就把书给你。”");
}
public void get(){
System.out.println("张三得到画了。");
}
public void give(){
System.out.println("张三把书给李四了。");
}
};
class LiSi
{
public void say(){
System.out.println("李四对张三说:“你给我书,我就把画给你。”");
}
public void get(){
System.out.println("李四得到书了。");
}
public void give(){
System.out.println("李四把画给张三了。");
}
};
public class ThreadDeadLock implements Runnable
{
private static ZhangSan zs = new ZhangSan();
private static LiSi ls = new LiSi();
private boolean flag;
public void run(){
if (flag)
{
synchronized(zs){
zs.say();
synchronized(ls){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
ls.give();
}
zs.get();
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
zs.give();
}
}else{
synchronized(ls){
ls.say();
synchronized(zs){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
zs.give();
}
ls.get();
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
ls.give();
}
}
}
public static void main(String args[]){
ThreadDeadLock t1 = new ThreadDeadLock();
ThreadDeadLock t2 = new ThreadDeadLock();
t1.flag = true;
t2.flag = false;
new Thread(t1).start();
new Thread(t2).start();
}
};
...全文
293 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
海澜百丈冰 2016-07-25
  • 打赏
  • 举报
回复
只要你这么写就会产生死锁 synchronized(ls){ //第一把锁,拿到就不会送掉,除非运行完,下面同理 ls.say(); synchronized(zs){ //第二把锁
bie_ren 2016-07-20
  • 打赏
  • 举报
回复
没多大区别啊 不都是一个锁a 等待b 另一个锁b 等待a吗
逸花城 2016-07-20
  • 打赏
  • 举报
回复
引用 楼主 zengqingmei 的回复:
关于“死锁”,书上有个例子,但我觉得不够充分,于是小改了一下,这样的思路正确不?运行结果是一样的。
class ZhangSan
{
	public void say(){
		System.out.println("张三对李四说:“你给我画,我就把书给你。”");
	}
	public void get(){
		System.out.println("张三得到画了。");
	}
	public void give(){
		System.out.println("张三把书给李四了。");
	}
};
class LiSi
{
	public void say(){
		System.out.println("李四对张三说:“你给我书,我就把画给你。”");
	}
	public void get(){
		System.out.println("李四得到书了。");
	}
	public void give(){
		System.out.println("李四把画给张三了。");
	}
};
public class ThreadDeadLock implements Runnable
{
	private static ZhangSan zs = new ZhangSan();
	private static LiSi ls = new LiSi();
	private boolean flag;
	public void run(){
		if (flag)
		{
			synchronized(zs){
				zs.say();
				synchronized(ls){
					try{
						Thread.sleep(500);
					}catch(Exception e){
						e.printStackTrace();
					}
					ls.give();
				}
				zs.get();
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
				zs.give();
			}
		}else{
			synchronized(ls){
				ls.say();
				synchronized(zs){
					try{
						Thread.sleep(500);
					}catch(Exception e){
						e.printStackTrace();
					}
					zs.give();
				}
				ls.get();
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
				ls.give();
			}
		}
	}
	public static void main(String args[]){
		ThreadDeadLock t1 = new ThreadDeadLock();
		ThreadDeadLock t2 = new ThreadDeadLock();
		t1.flag = true;
		t2.flag = false;
		new Thread(t1).start();
		new Thread(t2).start();
	}
};
感觉好别扭,再改改。。。
class ZhangSan
{
	public void say(){
		System.out.println("张三对李四说:“你给我画,我就把书给你。”");
	}
	public void get(){
		System.out.println("张三得到画了。");
	}
	public void give(){
		System.out.println("张三把书给李四了。");
	}
};
class LiSi
{
	public void say(){
		System.out.println("李四对张三说:“你给我书,我就把画给你。”");
	}
	public void get(){
		System.out.println("李四得到书了。");
	}
	public void give(){
		System.out.println("李四把画给张三了。");
	}
};
class Exchange implements Runnable
{
	private ZhangSan zs;
	private LiSi ls;
	private boolean flag;
	public Exchange(ZhangSan zs,LiSi ls,boolean flag){
		this.zs = zs;
		this.ls = ls;
		this.flag = flag;
	}
	public void run(){
		if (this.flag)
		{
			synchronized(zs){
				zs.say();
				synchronized(ls){
					try{
						Thread.sleep(500);
					}catch(Exception e){
						e.printStackTrace();
					}
					ls.give();
				}
				zs.get();
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
				zs.give();
			}
		}else{
			synchronized(ls){
				ls.say();
				synchronized(zs){
					try{
						Thread.sleep(500);
					}catch(Exception e){
						e.printStackTrace();
					}
					zs.give();
				}
				ls.get();
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
				ls.give();
			}
		}
	}
};
public class ThreadDeadLock
{
	public static void main(String args[]){
		ZhangSan zs = new ZhangSan();
		LiSi ls = new LiSi();
		Exchange e1 = new Exchange(zs,ls,true);
		Exchange e2 = new Exchange(zs,ls,false);
		new Thread(e1).start();
		new Thread(e2).start();
	}
};
renwotao2009 2016-07-19
  • 打赏
  • 举报
回复
改动过也可能产生死锁
逗泥丸的平方 2016-07-19
  • 打赏
  • 举报
回复
好复杂 不需要这么复杂的 ╮(╯▽╰)╭ 你可以去看看百度百科
逸花城 2016-07-19
  • 打赏
  • 举报
回复
引用 1 楼 renwotao2009 的回复:
改动过也可能产生死锁
我就是要产生死锁的啊!!!

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧