LeetCode Hot 熱題100 演算法題 104.二叉樹的最大深度-演算法&測試-easy模式
阿新 • • 發佈:2020-12-22
-
互斥條件:一個資源每次只能被一個程序使用。
-
請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
-
不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
-
迴圈等待條件:若程序之間形成一種頭尾詳解的迴圈等待資源的關係。
我們只要想辦法破其中的一個或多個條件就可以避免死鎖發生。
package Thread;
//死鎖:多個執行緒互相抱著對方需要的資源,然後形成僵持
public class DeadLock {
public static void main(String[] args) {
Makeup g1 = new Makeup(0,"灰姑娘");
Makeup g2 = new Makeup(1,"白雪公主");
g1.start();
g2.start();
}
}
//口紅
class Lipstick{
}
//鏡子
class Mirror{
}
class Makeup extends Thread{
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;
String girlName;
Makeup(int choice,String girlName){
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
//化妝
makeup();
}
//化妝,互相持有對方的鎖,就是需要拿到對方的資源
private void makeup(){
if (choice==0){
synchronized (lipstick) {
System.out.println(this.girlName + "獲得口紅的鎖");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror){
System.out.println(this.girlName+"獲得鏡子的鎖");
}
}else{
synchronized (mirror){
System.out.println(this.girlName+"獲得鏡子的鎖");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lipstick){
System.out.println(this.girlName+"獲得口紅的鎖");
}
}
}
} -