[英]Java Multithreading and Deadlock [on hold]
下面的程序使用SLEEP使死鎖,但它正常運行並在刪除Sleep方法時防止死鎖。 但是 sleep 是如何在這里造成僵局的呢? 不清楚Sleep或LOCK是否會在下面的程序中造成死鎖
import java.util.Scanner;
public class Main {
public static Object Lock1 = new Object();
public static Object Lock2 = new Object();
public static void main(String args[])throws InterruptedException {
Scanner scan = new Scanner(System.in);
one T1 = new one();
two T2 = new two();
T1.start();
T2.start();
}
static class one extends Thread {
public void run() {
synchronized (Lock1) {
System.out.println("Player 1: Waiting for the Player 2 to reach the ground");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
synchronized (Lock2) {
System.out.println("Player 2 get the wicket of the player 1");
}
}
}
}
static class two extends Thread {
public void run() {
Scanner scan = new Scanner(System.in);
synchronized (Lock2) {
System.out.println("Player 2: Waiting for player 1 to reach the ground");
try { Thread.sleep(10); }
catch (InterruptedException e) {}
synchronized (Lock1) {
System.out.println("Player 1 hits the ball of player 2");
}
}
}
}
}
您的代碼中沒有死鎖。
當您有兩個(或更多)線程時,就會發生死鎖,每個線程都持有一個鎖,並等待另一個線程釋放鎖; 例如
Thread A holds lock 1, and is waiting for lock 2
Thread B holds lock 2, and is waiting for lock 1
如您所見,線程 A 或 B 都無法向前推進。 曾經。
這是一個真正的僵局。 有關死鎖的更詳細解釋(附圖片!)請閱讀這篇文章。
在您的代碼中,沒有發生任何事情時的 state 將是:
thread A, holds lock 1, sleeping
thread B, waiting for lock 1.
當線程 A 完成睡眠(即 10 秒后),它將獲取鎖 2,打印第二條消息,釋放鎖 2,然后釋放鎖 1。當線程 A 釋放鎖 1 時,線程 B 將能夠繼續。
這不是僵局。 臨時凍結是由於鎖爭用(參見這篇文章),線程持有鎖的時間相對較長(10 秒)這一事實加劇了這種情況。
(您輸出的消息沒有多大意義,因為您的代碼正在執行的操作與您嘗試 model 的場景幾乎沒有關系。)
死鎖是由鎖引起的—— T1
有Lock1
, T2
正在等待它,但T2
有Lock2
, T1
正在等待它,所以兩個線程都無法取得進展。
但是,通常情況下(記住這一點很重要):
並發錯誤只會在您不走運時引起問題
沒有睡眠,錯誤就在那里,但通常不會發生死鎖。 通常,一個線程可以在另一個線程嘗試獲得第一個鎖之前獲得兩個鎖,在這種情況下,兩個線程都將正常完成。
它通常有效,但錯誤仍然存在。
當您放入睡眠時,它會迫使錯誤每次都成為問題。 每個線程在獲得第一個鎖后等待 10 毫秒,保證了另一個線程有足夠的時間去獲得另一個鎖,然后保證死鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.