2012-06-10 53 views
5

Tôi thấy ai đó sử dụng assert !Thread.holdsLock(lock) để tránh bế tắc.mục đích của Thread.holdsLock (khóa) là gì?

mục đích của việc này là gì? Nếu đối tượng khóa được giữ bởi một luồng khác, sẽ xác nhận nguyên nhân mã sẽ thoát ngay lập tức?

+0

bạn không hiểu gì từ javadoc: '' Trả về true khi và chỉ khi xử lí hiện tại nắm giữ khóa màn hình trên đối tượng được chỉ định.''? –

Trả lời

6

Các javadoc of the method nói:

Returns true nếu và chỉ nếu hiện chủ đề giữ khóa màn trên đối tượng quy định.

(tôi nhấn mạnh)

Vì vậy, khẳng định sẽ kiểm tra rằng các chủ đề hiện tại không giữ khóa màn hình của đối tượng khóa nhất định.

Lưu ý rằng các xác nhận được sử dụng để kiểm tra các bất biến và có thể bị tắt. Họ không nên được sử dụng để ngăn chặn bế tắc. Thử nghiệm if thông thường phải được sử dụng để thực hiện điều đó.

3

assert từ khóa được sử dụng để nắm bắt lỗi; nó không bao giờ nên được sử dụng để kiểm soát luồng chương trình. Vì vậy, hoặc đó là một sự hiểu lầm hoặc ai đó đang làm điều gì đó rất sai.
Nhiều khả năng, người đưa tuyên bố khẳng định đó vào đó để ngăn các nhà phát triển thêm nguy cơ bế tắc trong phân đoạn mã đó.

Như thế này:

assert !Thread.holdsLock(lock) : 
"Don't call this method while holding the lock." + 
"This method tries to acquire lock2 and that may cause a deadlock."; 
0

Các Thread.holdsLock(lock) chỉ có nghĩa là để kiểm tra xem các thread kêu gọi sở hữu lock, đó là nó.

Nó sẽ không ngăn chặn deadlocks (sẽ có được như vậy tuyệt vời để có phương pháp như vậy :))

Các vấn đề liên quan