2012-07-03 15 views
9

Bạn có thể cho tôi biết nếu tôi nên nhả khóa trước khi chờ trong tình trạng không?Điều kiện - nên mở khóa trước khi chờ?

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 

Hoặc

try { 
    lock.lock(); 
    while (isNotEmpty()) { 
     lock.unlock(); 
     condition.await(); 
    } 
} finally { 
    lock.unlock(); 
} 
+1

Bạn đã đọc [javadoc] (http://docs.oracle.com/javase/7/docs /api/java/util/concurrent/locks/Condition.html)? – assylias

+1

'mua(); thử {use(); } cuối cùng {release(); } '. Nếu bạn có được ('khóa') không thành công thì bạn sẽ giải phóng tài nguyên mà bạn chưa từng nắm giữ. Trong trường hợp này, bạn có thể mở khóa khóa của khóa [reentrant]. –

Trả lời

25

Không, bạn không cần phải phát hành một cách rõ ràng khóa trước khi gọi await, await sẽ phát hành nó tự động. Từ javadoc:

Các khóa liên quan đến tình trạng này là nguyên tử phát hành và thread hiện hành trở nên tàn tật cho các mục đích chủ đề lịch [...]

Và:

hiện nay thread được giả định là giữ khóa được liên kết với số này Condition khi phương thức này được gọi.

4

Bạn chỉ await() trên Condition khi bạn có khóa() có thể ED các liên Lock

Tại sao bạn không có điều kiện để isEmpty tạo điều kiện của bạn rõ ràng hơn.

Xem ví dụ trong Javadoc. http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

ví dụ:

lock.lock(); 
try { 
    while (count > 0) 
    isEmpty.await(); 
    // do something when empty. 
} finally { 
    lock.unlock(); 
} 
+2

* "Bạn không thể chờ đợi trên một khóa, bạn không có khóa." * Có lẽ 'khóa' là khóa liên kết với' điều kiện'. –

+0

@Tudor Hy vọng rằng nó rõ ràng hơn bây giờ. –

0

chờ và thông báo phải được gọi từ trong khối được đồng bộ hóa, do đó, cùng một quy tắc được áp dụng cho việc chờ và báo hiệu. Mặc dù đang chờ đợi phiên bản tự động, nhưng nếu bạn làm điều đó nên được giữa khóa() và mở khóa()

lock.lock()   // start of synchronized block 

condition.await() 

lock.unlock()  // end of synchronized block 
Các vấn đề liên quan