大概这就是传说中的死锁吧!synchronized关键字值得研究,关键看它到底锁了谁。
/**
* This is a demo of dead lock
*
* @author Administrator
*
*/
public class SyncDemo
{
public static void main(String[] args)
{
Person person = new Person();
Thread t1 = new MyThread(person);
Thread t2 = new MyThread2(person);
t1.start();
t2.start();
}
}
class MyThread extends Thread
{
private Person person;
public MyThread(Person person)
{
this.person = person;
}
@Override
public void run()
{
person.method1();
}
}
class MyThread2 extends Thread
{
private Person person;
public MyThread2(Person person)
{
this.person = person;
}
@Override
public void run()
{
person.method2();
}
}
class Person
{
private Object obj = new Object();
private Object o = new Object();
public void method1()
{
synchronized (obj)
{
for (int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long) (Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
method2();
System.out.println(Thread.currentThread() + " : " + i);
}
}
}
public void method2()
{
synchronized (o)
{
for (int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long) (Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
method1();
System.out.println(Thread.currentThread() + " : " + i);
}
}
}
}
再来一个更明了的(看过北京尚学堂马士兵老师的教程后根据回忆写的):
public class DeadLock
{
public static void main(String[] args)
{
final T2 t = new T2();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println("启动第一个线程:" + Thread.currentThread().getName());
t.test1();
}
}).start();
new Thread(new Runnable()
{
@Override
public void run()
{
System.out.println("启动第二个线程:" + Thread.currentThread().getName());
t.test2();
}
}).start();
}
}
class T2
{
private Object locker1 = new Object();
private Object locker2 = new Object();
public void test1()
{
synchronized (locker1)
{
System.out.println("哈哈,我得到了locker1,我再得到locker2,就完成任务了!哦耶!");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized (locker2)
{
System.out.println("哈哈,我又得到了locker2,我完成了任务!哦耶!");
}
}
}
public void test2()
{
synchronized (locker2)
{
System.out.println("哈哈,我得到了locker2,我再得到locker1,就完成任务了!哦耶!");
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized (locker1)
{
System.out.println("哈哈,我又得到了locker1,我完成了任务!哦耶!");
}
}
}
}