死锁的产生:
举个例子说明,有两个线程分别是t1和t2,有两个对象分别为o1和o2,t1已经拿到了o1的对象锁只要再拿到o2的对象锁线程t1就能完成;同时,线程t2已经拿到了o2的对象锁,只要再拿到o1的对象锁线程t2也能完成。此时就产生了死锁问题。下面是一个简单的死锁的示例
public class testDeadLock {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Thread t1 = new Thread(new thread1(o1,o2),"t1");
Thread t2 = new Thread(new thread2(o1,o2),"t2");
t1.start();
t2.start();
}
}
class thread1 implements Runnable{
Object o1;
Object o2;
public thread1(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
public void run() {
System.out.println(Thread.currentThread().getName()+" has locked o1");
synchronized (o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println(Thread.currentThread().getName()+" is finish");
}
}
}
}
class thread2 implements Runnable{
Object o1;
Object o2;
public thread2(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
public void run() {
synchronized (o2) {
System.out.println(Thread.currentThread().getName()+" has locked o2");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println(Thread.currentThread().getName()+" is finish");
}
}
}
}
结果输出为:t1 has locked o1
t2 has locked o2
无法执行到
System.out.println(Thread.currentThread().getName()+" is finish")