死锁非常难调试,所以要重视死锁,下面是一个死锁的例子。
–信号量使用不当也会造成死锁。进程间彼此相互等待对方发来的消息,结果也会使得这 些进程间无法继续向前推进。例如,进程A等待进程B发的消息,进程B又在等待进程A 发的消息,可以看出进程A和B不是因为竞争同一资源,而是在等待对方的资源导致死锁。
–下面代码,两个线程t1,t2,都共享o1,o2两个对象,利用 synchronized先让t1锁住o1,t2锁住o2,然后t1就无法寻找到o2的锁, t2就无法找到 t1的锁 , 就形成死锁。
package cn.itcast.day04.demo01.Kt1.test2;
public class DeadLock {
public static void main(String[] args) {
//线程共享o1,o2,两个对象
Object o1 = new Object();
Object o2 = new Object();
//创建两个线程,并吧共享对象o1,o2,传进去
Thread t1 = new MyThread1(o1,o2);
Thread t2 = new MyThread2(o1,o2);
//修改线程的名字
t1.setName("t1");
t2.setName("t2");
//启动线程,将将会创建出自己的栈。
t1.start();
t2.start();
}
}
//这是线程类
class MyThread1 extends Thread{
//创建出共享对象 和构造方法。
Object o1;
Object o2;
public MyThread1(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run(){
//先锁住o1对象然后让线程睡1秒保证死锁能够形成。
synchronized (o1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//锁完o1然后锁o2,jvm发现已经被t2锁住,t1就会无限排队。
synchronized (o2){
}
}
}
}
class MyThread2 extends Thread{
Object o1;
Object o2;
public MyThread2(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run(){
synchronized (o2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//锁完o2再锁o1,发现t1已经锁住o1,这是=时就形成死锁。
synchronized (o1){
}
}
}