大家工作中或者面试的时候,会碰到死锁的问题,大家都听说过两个线程互相等待,从而导致等死(锁)的情况吧,就是线程1持有对象1的锁,线程2持有对象2的锁,然后两者都等待对方释放其持有对象的锁,然后一直等,等到死亡。但是听是都听过,若有人让你写个例子呢???
下面就举个例子:
public class DieLock {
public static Object t1 = new Object();
public static Object t2 = new Object();
public static void main(String[] args){
new Thread(){
@Override
public void run(){
synchronized (t1){
System.out.println("Thread1 get t1");
try {
Thread.sleep(100);
}catch (Exception e){
}
synchronized (t2){
System.out.println("Thread2 get t2");
}
}
}
}.start();
new Thread(){
@Override
public void run(){
synchronized (t2){
System.out.println("Thread2 get t2");
try {
Thread.sleep(100);
}catch (Exception e){
}
synchronized (t1){
System.out.println("Thread2 get t1");
}
}
}
}.start();
}
}
运行的结果如下:
两者一直等待对方释放持有的锁,然后一直等到死亡。。。
中间加睡眠时间,是为了防止线程一运行就获得两个对象的锁。
如何避免死锁的产生呢???
下面给几个建议:
避免一个线程同时获取多个锁;
避免一个线程在锁内同时占据多个资源,尽量保证每个锁只占据一个资源;
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制;
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。