Nhờ giải thích đoạn code Java tạo deadlock giữa hai Thread

Em search trên mạng đoạn code tạo deadlock giữa hai thread mà không hiểu lắm.Anh chị nào biết giải thích giùm em với ạ.Phần này học không nên hơi mơ hồ.

package com.java2novice.algos;
 
public class MyDeadlock {
 
    String str1 = "Java";
    String str2 = "UNIX";
     
    Thread trd1 = new Thread("My Thread 1"){
        public void run(){
            while(true){
                synchronized(str1){
                    synchronized(str2){
                        System.out.println(str1 + str2);
                    }
                }
            }
        }
    };
     
    Thread trd2 = new Thread("My Thread 2"){
        public void run(){
            while(true){
                synchronized(str2){
                    synchronized(str1){
                        System.out.println(str2 + str1);
                    }
                }
            }
        }
    };
     
    public static void main(String a[]){
        MyDeadlock mdl = new MyDeadlock();
        mdl.trd1.start();
        mdl.trd2.start();
    }
}

See more at: http://www.java2novice.com/java-interview-programs/thread-deadlock/#sthash.h1LvUa0u.dpuf

1 Like

Giả sử bộ xử lí cực nhanh, việc thực thi tạo 2 thread k mất quá nhiều tg, khi ấy thread 1 đã chiếm giữ đc str1, và sẽ tiếp tục chiếm giữ tiếp str2 k cho các thread khác đụng vào hay chiếm giữ, tuy nhiên lúc này giả sử thread 2 cũng đã bắt đầu chạy và đã chiếm giữ str2 và sẽ chuẩn bị chiếm str1, tuy nhiên str1 lúc này đã bị lock bởi thread 1 nên thread 2 phải chờ đến lúc nào str1 k bị lock nữa, tương tự, thread 1 cũng k thể chiếm đc str2 nữa mà phải chờ thread2 nhả lock str2 ra, vì 2 thằng đều đang lock đối tượng của nhau và chờ đối tượng của nhau nên k bao giờ nhả lock đc, vì thế xảy ra deadlock, cả 2 thread 1, 2 lúc này sẽ k bao giờ chạy xong, 2 đối tượng str1, str2 cũng k thể truy cập bởi bất cứ thread nào khác
Update: cho dù việc tạo mới thread k nhanh thì với vòng while true thế kia thì chắc chắn sẽ có lúc xảy ra TH thread 1 đang lock str1 thread 2 đang lock str2 và thread 1 đợi lock str2, thread 2 đợi lock str1

3 Likes

Hàm synchronized (str1) nó hoạt độnh thế nào anh…em chưa hiểu lắm…

Hàm synchronized(str1) sẽ request java monitor ngăn k cho thread khác truy cập tới str1, thread nào gọi trc sẽ khóa trc, các thread khác sẽ phải đợi đến khi nào thread trên thực hiện xong tất cả lệnh nằm trong block sync… hoặc thread trên gọi hàm wait() để tạm giải phóng monitor cho thread khác, hoặc đối tượng str1 gọi hàm notify hoặc notifyAll trong thread đang chiếm giữ str1 để gỡ bỏ java monitor trao quyền lại cho các thread khác, các thread đợi str1 sẽ tranh giành nhau chiếm lại str1 trừ thread mới giải phóng str1

2 Likes

Bạn cứ tưởng tượng hàm synchronized giống như 1 căn phòng, còn str1 là 1 phạm nhân, mỗi thread gọi synchronized sẽ tìm cách nhốt phạm nhân vào phòng, vì thế 1 ng k thể ở 2 phòng 1 lúc dc do đó thread nào bắt đc ng sẽ toàn quyền quyết định, còn thread khác sẽ phải đợi ng đc thả ra rồi mới bắt đc, quay lại ví dụ trên, giả sử nhà tù 1(thread1) bắt đc str1 và nhốt lại, giờ tìm cách nhốt thêm str2 rồi mới thả cả 2 ra, trong lúc này nhà tù 2( thread2) cũng bắt dc str2 và tìm cách bắt lại str1 rồi mới cho thả người, nhưng giờ str1 và str2 đã bị bắt nên có tìm thì cả 2 nhà tù cũng cũng k bắt đc đủ cả 2 ng, do đó cả 2 vụ án bị treo lại, chả đi đâu đến đâu cả

3 Likes

Dạ…e hiểu rồi…e cảm ơn anh.anh giải thích rất dễ hiểu

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?