www.updatesofts.com
!
"
+
&
Hình 8.8 Kết quả sau mỗi lần kích chuột
8.12 Sự bế tắt (Deadlocks)
Một “deadlock” (sự bế tắt) xảy ra khi hai luồng có một phụ thuộc vòng quanh
trên một cặp đối tượng đồng bộ; lấy ví dụ, khi một luồng thâm nhập vào monitor trên đối
tượng “ObjA”, và một luồng khác thâm nhập vào monitor trên đối tượng “ObjB”. Nếu
luồng trong “ObjA” cố gắng gọi phương thức đồng bộ trên “ObjB”, một bế tắt xảy ra.
Nó khó để gỡ lỗi một bế tắt bởi những nguyên nhân sau:
Nó hiểm khi xảy ra, khi hai luồng chia nhỏ thời gian trong cùng một con đường
Nó có thể bao hàm nhiều hơn hai luồng và hai đối tượng đồng bộ
Nếu một chương trình đa luồng khóa kín thường xuyên, ngay lập tức kiểm tra lại
điều kiện bế tắt.
Chương trình 8.7 tạo ra điều kiện bế tắt. Lớp chính (main) bắt đầu 2 luồng. Mỗi
luồng gọi phương thức đồng bộ run(). Khi luồng “t1” đánh thức, nó gọi phương thức
“synchIt()” của đối tượng deadlock “dlk1”. Từ đó luồng “t2” một mình giám sát cho “dlk2”,
luồng “t1” bắt đầu đợi monitor. Khi luồng “t2” đánh thức, nó cố gắng gọi phương thức
“synchIt()” của đối tượng Deadlock “dlk2”. Bây giờ, “t2” cũng phải đợi, bởi vì đây là
trường hợp tương tự với luồng “t1”. Từ đó, cả hai luồng đang đợi lẫn nhau, cả hai sẽ đánh
thức. Đây là điều kiện bế tắt.
Chương trình 8.7
public class Deadlock implements Runnable{
public static void main(String args[]){
Deadlock dlk1= new Deadlock();
Deadlock dlk2 = new Deadlock();
Thread t1 = new Thread(dlk1);
Thread t2 = new Thread(dlk2);
dlk1.grabIt = dlk1;
dlk2.grabIt = dlk2;
t1.start();
t2.start();
System.out.println("Started");
try{
t1.join();
t2.join();