黑马程序员技术交流社区
标题:
求教一个死锁的程序
[打印本页]
作者:
Ezreal
时间:
2014-8-1 16:35
标题:
求教一个死锁的程序
死锁看的不太懂,谁能给个死锁程序吗,尽量简单,能够说明问题就好。好人一生平安{:3_64:}
作者:
ily521125
时间:
2014-8-1 17:04
本帖最后由 ily521125 于 2014-8-1 17:52 编辑
多线程中,同步嵌套同步会发生死锁
作者:
ily521125
时间:
2014-8-1 17:07
本帖最后由 ily521125 于 2014-8-1 17:50 编辑
/*
死锁:
同步中嵌套同步
如:在多线程中,线程一中locka锁嵌套lockb锁,线程二中lockb锁嵌套locka锁,会发生死锁
注:locka lockb为锁对象
*/
class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
synchronized(MyLock.locka) //锁对象为locka
{
System.out.println(Thread.currentThread().getName()+"...if locka");
synchronized(MyLock.lockb) //锁对象为lockb
{
System.out.println(Thread.currentThread().getName()+"...if lockb");
}
}
}
else
{
synchronized(MyLock.lockb) //锁对象为lockb
{
System.out.println(Thread.currentThread().getName()+"...if lockb");
synchronized(MyLock.locka) //锁对象为locka
{
System.out.println(Thread.currentThread().getName()+"...if locka");
}
}
}
}
}
class MyLock
{
//创建两个Object对象
static Object locka=new Object();
static Object lockb=new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
Thread t1=new Thread(new Test(true)); //创建线程一,并添加一个对象
Thread t2=new Thread(new Test(false)); //创建线程二,并添加一个对象
t1.start(); //启动线程一
t2.start(); //启动线程二
}
}
复制代码
作者:
朱道研
时间:
2014-8-1 18:31
A里锁个B B里锁个A
作者:
怀念黑海岸
时间:
2014-8-1 19:31
你记好就成了,同步中最好别用嵌套,就是同步中有同步,就能很大程度避免死锁。
作者:
李大壮
时间:
2014-8-1 21:22
示例的程序里锁只有两把噢,别搞混了。如果线程进了第一个synchronized而进不去第二个,是因为第二个已经被另一个线程拿了。你跟着线程走一下就好理解了。
作者:
adent
时间:
2014-8-1 22:55
两个进程资源占用是互斥就行了
作者:
梧桐树下
时间:
2014-8-2 00:49
同步那地方
作者:
fantacyleo
时间:
2014-8-2 01:19
我把Oracle官方的死锁程序给你吧,既简单,又有趣
/**
* 死锁示例:
* 张三李四相互鞠躬问候。
* 张三看到李四向自己鞠躬后,就鞠躬回礼(调用李四的bowBack方法)。
* 李四看到张三向自己鞠躬后,也鞠躬回礼(调用张三的bowBack方法)。
* 张三拿着张三对象的锁,想调李四的bowBack方法
* 李四拿着李四对象的锁,想调张三的bowBack方法
* 互相拿着对方需要的锁,造成死锁
*
* @author lihao
*
*/
public class DeadlockDemo {
public static void main(String[] args) {
final Friend zhangsan = new Friend("张三");
final Friend lisi = new Friend("李四");
Thread t1 = new Thread(new Runnable() {
public void run() { zhangsan.bow(lisi); }
}); // 张三向李四鞠躬
Thread t2 = new Thread(new Runnable() {
public void run() { lisi.bow(zhangsan); }
}); // 李四向张三鞠躬
t1.start();
t2.start();
}
}
class Friend {
private String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.println(this.name + "说:" + bower.getName() + "向我鞠躬问候了");
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.println(this.name + "说:" + bower.getName() + "向我鞠躬回礼了");
}
}
复制代码
作者:
Joemi
时间:
2014-8-2 08:15
学习了~
作者:
Ezreal
时间:
2014-8-2 09:15
ily521125 发表于 2014-8-1 17:07
十分感谢
作者:
Ezreal
时间:
2014-8-2 09:16
fantacyleo 发表于 2014-8-2 01:19
我把Oracle官方的死锁程序给你吧,既简单,又有趣
thankyou thankyou
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2