黑马程序员技术交流社区
标题:
死锁是怎么回事??????
[打印本页]
作者:
刘海源
时间:
2012-7-22 19:13
标题:
死锁是怎么回事??????
class Test implements Runnable
{
private boolean flag ;
Test(boolean flag)
{
this.flag = flag;
}
public void run()
{
if(flag)
{
while(true)
{
synchronized(MyLock.locka)
{
System.out.println("if.....locka");
synchronized(MyLock.lockb)
{
System.out.println("if.....lockb");
}
}
}
}
else
{
while(true)
{
synchronized(MyLock.lockb)
{
System.out.println("else.....lockb");
synchronized(MyLock.locka)
{
System.out.println("else.....locka");
}
}
}
}
}
}
class MyLock
{
public static Object locka = new Object();
public static Object lockb = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
Test a = new Test(true);
Test b = new Test(false);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
作者:
朱烈葵
时间:
2012-7-22 19:24
你想知道什么?
作者:
陈世涛
时间:
2012-7-22 19:33
最常见的死锁情况:同步嵌套。
同步中还有同步,两个同步用的不是一个锁。
记住尽量避免同步嵌套的情况。
代码实现;
class Ticket implements Runnable
{
private int num = 200;
private Object obj = new Object();
private boolean flag = true;
public void run()
{
// System.out.println("run :"+this);
if(flag)//为true就执行同步代码块。
while(true)
{
synchronized(obj)
{
show();
}
}
else//为false就执行同步函数。
while(true)
{
show();
}
}
/*
将标记改为false。
*/
public void setFlag()
{
flag = false;
}
public synchronized void show()//this
{
synchronized(obj)
{
if(num>0)
{
try{Thread.sleep(10);}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+"............sale....."+num--);
}
}
}
}
class DeadLockDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
// System.out.println("t:"+t);
//创建线程对象。
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(InterruptedException e){}
//在开启了t1后,将标记置为false。
t.setFlag();
t2.start();
}
}
希望对楼主有帮助。
我们才学过的。
作者:
罗宵
时间:
2012-7-22 19:41
死锁就是多个线程公用相同的锁,将一个锁套在另一个锁里面。线程彼此需要对方的锁才能进行程序。 你主方法中创建了2个线程,启动后都会去执行程序class MyLock
{
public static Object locka = new Object();
public static Object lockb = new Object();
}
你创建了2个静态的锁。可以被所有对象使用。所以两个线程中的锁是相同的。线程启动后都抢占执行权。当一个线程(假如t1)走到
if(flag)
{
while(true)
{
synchronized(MyLock.locka)
{
System.out.println("if.....locka");
synchronized(MyLock.lockb)
{
System.out.println("if.....lockb");
中的第一个锁内时即 synchronized(MyLock.locka)
{
System.out.println("if.....locka");
,另一个线程(假如t2)走到
else
{
while(true)
{
synchronized(MyLock.lockb)
{
System.out.println("else.....lockb");
synchronized(MyLock.locka)
{
System.out.println("else.....locka");
它中的第一个锁时即 synchronized(MyLock.lockb)
{
System.out.println("else.....lockb");
,t1需要lockb才能继续走下去,t2需要locka猜能走下去,但是彼此又都占用这双方需要的锁。都不能得到。所以就死锁了。
作者:
李菁
时间:
2012-7-22 20:43
简单说就是线程A想访问线程B占用的b资源,而同时,B想访问A占有的a资源,A和B都无法释放,访问想访问的资源,就造成了死锁.解决死锁可以用同步
作者:
刘奇
时间:
2012-7-22 22:37
个人认为如果想解决死锁的问题,是需要好好的去看一下操作系统关于这方面的讲解的。关键其实就是P和V操作要理解,然后去看一下例如经典的消费者生产者模型和哲学家进餐模型,然后再遇到可能会出现死锁的状况时,思路会很清晰
作者:
王璐
时间:
2012-7-23 08:10
11.png
(22.95 KB, 下载次数: 34)
下载附件
2012-7-23 08:10 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2