日期:2014-05-20  浏览次数:20714 次

关于死锁不是很理解
[code=Java][/code]
class Synchronized implements Runnable
{
private boolean flag;
Synchronized (boolean flag)
{
this.flag=flag;
}
public void run()
{
if (flag==true)
{
synchronized(LockDemo.a)
{
System.out.println("a锁第一层");
synchronized(LockDemo.b)
{
System.out.println("a锁第二层");
}
}
}
else
synchronized(LockDemo.b)
{
System.out.println("b锁第一层");
synchronized(LockDemo.a)
{
System.out.println("b锁第二层");
}
}
}
}
class LockDemo
{
static LockDemo a=new LockDemo();
static LockDemo b=new LockDemo();
}
class LockDemo1
{
public static void main(String[] args)
{
Synchronized s=new Synchronized(true);
Synchronized s1=new Synchronized(false);
Thread t=new Thread(s);
Thread t1=new Thread(s1);
t.start();
t1.start();
}
}
我觉得s和s1不是2个对象么?那么线程t操作s对象 线程t1操作s1对象 两个线程操作的是两个不同对象它们两个怎么会有影响呢?

------解决方案--------------------
关键在于这两个对象共同操作了:
static LockDemo a=new LockDemo();
static LockDemo b=new LockDemo();

其中一个是用:
synchronized(LockDemo.a) {
System.out.println("a锁第一层");
synchronized(LockDemo.b)
这种方式先锁住a,再锁住b。


而另一个使用:
synchronized(LockDemo.b) {
System.out.println("b锁第一层");
synchronized(LockDemo.a)
这种方式先锁住b,在锁住a。


所以就死锁了。


s、s1两个小朋友,a、b两个水果。s抢了a,还要b;s1抢了b,还要a。
------解决方案--------------------
就理解为科学家拿筷子问题。科学家围成一桌,每个科学家之间只有1只筷子。结果每个科学家都拿着左手边筷子不放手,结果都饿死了。
该问题也是一样的。
new了两只筷子a,b。new了两个人s,s1.
规则是 拿到两个锁之后就可以线程结束释放锁,就是拿到两种筷子吃完饭,筷子洗一下别人又可以用了。
结果s拿着a筷子不放,b拿着b筷子不放,结果两个人都吃不了饭,资源释放不了,产生死锁。

------解决方案--------------------
你把你那
static LockDemo a = new LockDemo();
static LockDemo b = new LockDemo();
改成
LockDemo a = new LockDemo();
LockDemo b = new LockDemo();
就和你一开始想的一样。

如果是
static LockDemo a = new LockDemo();
static LockDemo b = new LockDemo();
你那样理解是错的。。。去了解下static