Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách tránh deadlock trong Java?

Trong Java, deadlock là tình huống lập trình nơi hai hoặc nhiều thread bị chặn vĩnh viễn. Deadlock xảy ra với ít nhất hai thread và hai hoặc nhiều tài nguyên.

Cách tránh Deadlock

  • Tránh khóa lồng nhau (Nested Locks): Deadlock thường xảy ra khi cấp khóa cho nhiều thread. Tránh cấp khóa cho nhiều thread nếu đã cấp cho một.
  • Tránh khóa không cần thiết (Unnecessary Locks): Chỉ khóa những thành viên cần thiết. Khóa thừa dẫn đến deadlock.
  • Sử dụng Thread.join(): Deadlock xuất hiện khi thread chờ thread khác kết thúc. Dùng Thread.join() với thời gian tối đa thực thi.

Ví dụ

public class DeadlockTest { 
    public static void main(String[] args) throws InterruptedException { 
        Object obj1 = new Object(); 
        Object obj2 = new Object(); 
        Object obj3 = new Object(); 
        Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1"); 
        Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2"); 
        t1.start(); 
        Thread.sleep(2000); 
        t2.start(); 
        Thread.sleep(2000); 
    } 
} 

class SyncThread implements Runnable { 
    private Object obj1; 
    private Object obj2; 
    public SyncThread(Object o1, Object o2){ 
        this.obj1 = o1; 
        this.obj2 = o2; 
    } 
    @Override 
    public void run() { 
        String name = Thread.currentThread().getName(); 
        System.out.println(name + " acquiring lock on " + obj1); 
        synchronized (obj1) { 
            System.out.println(name + " acquired lock on " + obj1); 
            work(); 
        } 
        System.out.println(name + " released lock on " + obj1); 
        System.out.println(name + " acquiring lock on " + obj2); 
        synchronized (obj2) { 
            System.out.println(name + " acquired lock on " + obj2); 
            work(); 
        } 
        System.out.println(name + " released lock on " + obj2); 
        System.out.println(name + " finished execution."); 
    } 
    private void work() { 
        try { 
            Thread.sleep(5000); 
        } catch (InterruptedException ie) { 
            ie.printStackTrace(); 
        } 
    } 
}

Kết quả

t1 acquiring lock on java.lang.Object@917d8d4 t1 acquired lock on java.lang.Object@917d8d4 t2 acquiring lock on java.lang.Object@5c4b42fb t2 acquired lock on java.lang.Object@5c4b42fb t1 released lock on java.lang.Object@917d8d4 t1 acquiring lock on java.lang.Object@5c4b42fb t1 acquired lock on java.lang.Object@5c4b42fb t2 released lock on java.lang.Object@5c4b42fb t2 acquiring lock on java.lang.Object@528cb702 t2 acquired lock on java.lang.Object@528cb702 t1 released lock on java.lang.Object@5c4b42fb t2 released lock on java.lang.Object@528cb702 t1 finished execution. t2 finished execution.