死锁
对锁的使用不恰当时,很容易会造成死锁,死锁不会报异常,只是程序一直不停止,很难调试,最好不要写出死锁的代码。
比如:
A占有了R1资源,但是需要R2资源,B占有了R2资源,但是需要R1资源,A、B此时就会一直陷入等待中......
死锁代码
面试你就有可能遇到让你手写一个死锁代码的题目!
因为只有你会写死锁的代码,知道什么情况下会出现死锁,你才不会在实际开发中写出死锁代码。
例:t1线程锁住了o1,想要锁o2,但是o2已经被t2锁住了,t2又想锁o1,所以线程t1和线程t2都结束不了同步代码块。
package com.dh.deadlock;
public class DeadLock {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
Thread t1 =new MyThread01(o1,o2);
Thread t2 =new MyThread02(o1,o2);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
class MyThread01 extends Thread {
private Object o1;
private Object o2;
public MyThread01(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
@Override
public void run() {
synchronized (o1){
//确保t2线程锁住o2
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
}
}
}
}
class MyThread02 extends Thread {
private Object o1;
private Object o2;
public MyThread02(Object o1, Object o2) {
this.o1 = o1;
this.o2 = o2;
}
@Override
public void run() {
synchronized (o2){
synchronized (o1){
}
}
}
}
结果:
程序一直运行,一年十年都是这样。