一、死鎖:所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都無法向前推進。
二、如何避免死鎖
1、加鎖順序(線程按照一定的順序加鎖)---------本例就是採用這種方法
2、加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己佔有的鎖),例如本例中的線程,佔了一個鎖又再請求另一個鎖。
package thread;
/**
* 避免死鎖
* 獲取鎖的順序
* 核心所在:t1.join();
* 把t1.join() 去掉就是demo01的死鎖了
*
* Created by sxf on 2018/6/27.
*/
public class DeadLockDemo02 {
private int flag = 1;
private static Object o1 = new Object();
private static Object o2 = new Object();
public static void main(String[] args) {
final Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
money(1);
}
});
t1.start();
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
t1.join(); //*核心所在****************************************************
} catch (InterruptedException e) {
e.printStackTrace();
}
money(0);
}
});
t2.start();
}
public static void money(int flag) {
System.out.println("flag:" + flag);
if (flag == 1) {
synchronized(o1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1進來的");
}
}
}
if (flag == 0) {
synchronized(o2) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0進來的");
}
}
}
}
}
運行結果:
flag:1
1進來的
flag:0
0進來的