簡體   English   中英

Java 多線程和死鎖 [暫停]

[英]Java Multithreading and Deadlock [on hold]

下面的程序使用SLEEP使死鎖,但它正常運行並在刪除Sleep方法時防止死鎖。 但是 sleep 是如何在這里造成僵局的呢? 不清楚SleepLOCK是否會在下面的程序中造成死鎖

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 的場景幾乎沒有關系。)

死鎖是由鎖引起的—— T1Lock1T2正在等待它,但T2Lock2T1正在等待它,所以兩個線程都無法取得進展。

但是,通常情況下(記住這一點很重要):

並發錯誤只會在您不走運時引起問題

沒有睡眠,錯誤就在那里,但通常不會發生死鎖。 通常,一個線程可以在另一個線程嘗試獲得第一個鎖之前獲得兩個鎖,在這種情況下,兩個線程都將正常完成。

它通常有效,但錯誤仍然存在

當您放入睡眠時,它會迫使錯誤每次都成為問題。 每個線程在獲得第一個鎖后等待 10 毫秒,保證了另一個線程有足夠的時間去獲得另一個鎖,然后保證死鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM