java中死鎖的概念是什么
死鎖
當(dāng)兩個線程循環(huán)依賴于一對同步對象(monitor)時將發(fā)生死鎖。馬克-to-win例如:
一個線程進入對象ObjA上的監(jiān)視器,而另一個線程進入對象ObjB上的監(jiān)視器。如果ObjA中的線程試圖調(diào)用ObjB上的任何 synchronized 方法,同時,反向的情況也發(fā)生,就將發(fā)生死鎖。
死鎖很少發(fā)生,但一旦發(fā)生就很難調(diào)試。馬克- to-win:馬克 java社區(qū):防盜版實名手機尾號: 73203。
在以下例子中:a正在等待b釋放,b也正在等待a釋放,a怎么才能釋放鎖呢?只有a往前移動一個語句,執(zhí)行完disp,a就能自動釋放鎖,但執(zhí)行disp需要b釋放鎖,所以因為執(zhí)行不了disp,所以a不能釋放鎖。b也一樣,所以大家就在這互相等,從而發(fā)生了死鎖。
對于下面的例子:馬克-to-wind1.start()作為一個線程,獲得d1的鎖。為什么?因為synchronized public void run().所以run()的synchronized不能去掉。d2.start()作為一個線程獲得d2的鎖。沒有問題,所以打印出來兩個“in ru”。然后,在d1's run()的 d.disp()使得d1試圖從d2獲得一個鎖,因為在這一刻,d.disp()意味著d1.d.disp()= d2.disp(),意味著d1試圖得到一個鎖從d2,反之亦然。
如果任何synchronized 刪除,不會發(fā)生死鎖,但安全性降低。
例1.10.1-本章源碼
class DeadLockExam extends Thread {
DeadLockExam d;
synchronized void disp() {
System.out.println("in di");
}
synchronized public void run() {
System.out.println("in ru");
try {
Thread.sleep(1000);
} catch (Exception e) {
}
d.disp();
}
}
public class TestMark_to_win {
public static void main(String[] args) {
DeadLockExam d1 = new DeadLockExam();
DeadLockExam d2 = new DeadLockExam();
d1.d = d2;
d2.d = d1;
d1.start();
d2.start();
}
}
運行結(jié)果是
in ru
in ru