本帖最后由 彭盼 于 2012-7-11 14:45 编辑
同志,你这样new MyLock()是不行的,你这样就建立了四个匿名的对象,
也就是说四把锁是完全不同的,怎么可能锁住呢
按你的想法,我想代码可以这样写:
package cn.pengpan.fuxi1;
class Test implements Runnable
{
private boolean flag;
private MyLock myLock;
Test(boolean flag,MyLock myLock)//把同一个锁资源作为构造函数传入,确保两个线程操作一个资源
{
this.flag = flag;
this.myLock=myLock;
}
public void run()
{
if(flag)
{
while(true)
{
synchronized(myLock.locka)
{
System.out.println(Thread.currentThread().getName()+"...if locka ");
synchronized(myLock.lockb)
{
System.out.println(Thread.currentThread().getName()+"..if lockb");
}
}
}
}
else
{
while(true)
{
synchronized(myLock.lockb)
{
System.out.println(Thread.currentThread().getName()+"..else lockb");
synchronized(myLock.locka)
{
System.out.println(Thread.currentThread().getName()+".....else locka");
}
}
}
}
}
}
class MyLock
{
Object locka = new Object();
Object lockb = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
MyLock myLock=new MyLock();//保证两个线程都是操作的是同一个资源
Thread t1 = new Thread(new Test(true,myLock));//myLock自身拥有两把锁,可以保证两个线程发生死锁
Thread t2 = new Thread(new Test(false,myLock));
t1.start();
t2.start();
}
}
|