class MyLock
{
public static Object lock_a = new Object();
public static Object lock_b = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
Test t1 = new Test(true);
Test t2 = new Test(false);
new Thread(t1).start();
new Thread(t2).start();
}
} 作者: 孙天 时间: 2012-4-25 21:30
思索就是两把锁相互调用,一种情况是同步嵌套,如下,写程序的时候要理清思路,注意观察,尽量避免这种情况的发生
class Test implements Runnable
{
private boolean flag = true;
Test(boolean flag)
{
this.flag = flag;
}
public void run()
{
while(true)
{
if(flag)
{
synchronized(MyLock.lock_a)
{
System.out.println(Thread.currentThread().getName()+"..if lock_a");
synchronized(MyLock.lock_b)
{
System.out.println(Thread.currentThread().getName()+"..if lock_b");
}
}
}
else
{
synchronized(MyLock.lock_b)
{
System.out.println(Thread.currentThread().getName()+"..else lock_b");
synchronized(MyLock.lock_a)
{
System.out.println(Thread.currentThread().getName()+"..else lock_a");
}
}
}
}
}
}
class MyLock
{
public static Object lock_a = new Object();
public static Object lock_b = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
Test t1 = new Test(true);
Test t2 = new Test(false);
new Thread(t1).start();
new Thread(t2).start();
}
} 作者: 王德南 时间: 2012-4-25 21:35
按照下面几条规则去设计系统,就能够避免Java线程死锁问题:
(1)、让所有的线程按照同样的顺序获得一组锁。
(2)、将多个锁组成一组并放到同一个锁下。
(3)、将那些不会阻塞的可获得资源用变量标志出来。作者: 韩新凯 时间: 2012-4-28 22:22
避免两个或两个以上的线程同时调用同一个锁作者: kevindavid 时间: 2012-4-28 22:42
避免死锁首先:要清楚 出现死锁的四个必要但不充分条件:
1)互斥的使用资源
2)占有且等待更多的资源
3)非抢夺式分配资源
4)循环等待资源
如果 你现在是大三的学生的计算机专业 学生的话应该会学操作系统概论这本书里面有。你只要破坏这里面的任何一个条件就可以破坏死锁了。
避免死锁最好的办法就是 银行家算法。因为银行家算法是先满足一个请求的资源再满足其他的资源 作者: 根号5 时间: 2012-4-28 22:49
上边的同志们回答的都很好,就是要明白什么是死锁,才能在实际开发中避免这种情况的发生。 我认为应该尽量不要使用锁的嵌套,在代码量非常庞大情况下很容易出现错误。 其实开发的话可以使用JDK1.5的新特性,lock(),unlock()方法:代码示例如下
Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}
A successful lock operation has the same memory synchronization effects as a successful Lock action.
A successful unlock operation has the same memory synchronization effects as a successful Unlock action.
lock就是为***加锁
相反unlock就是为***解锁。