java死鎖產生的原因
產生死鎖,至少有兩把鎖,多執行緒。一般是A執行緒獲取A鎖,B執行緒獲取了B鎖,這時A執行緒又要獲取B鎖,B執行緒又要獲取A鎖,從而導致死鎖,這個會出現程式碼不繼續執行了,可以用jconsole分析,哪個執行緒產生了死鎖。
1、程式至少有兩把鎖,相互鎖住。
public class DeadLock implements Runnable{
private volatile int i=0;
private Object key = new Object();
private Object key1 = new Object();
@Override
public void run() {
i++;
if(i%2 == 0){
synchronized (key) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (key1) {
}
}
}else{
synchronized (key1) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (key) {
}
}
}
System.out.println("釋放鎖了");
}
}
2、還有一種是鎖住了,但是沒有釋放鎖。可能是中途拋了異常,或者直接return了,導致鎖沒有釋放。
Lock lock = new ReentrantLock();
lock.lock();
String a = null;
a.toString();
lock.unlock();