2012-05-15 11 views
6

Tôi cần một số trợ giúp để hiểu những lợi thế của việc sử dụng CountDownLatch qua thông báo chờ đợi truyền thống. Tôi nghĩ rằng notifyAll() thực sự làm điều tương tự, và nó có vẻ dễ dàng hơn để sử dụng (có thể vì sự quen thuộc).Sự khác biệt giữa việc chờ thông báo và CountDownLatch

Ngoài ra, sự khác nhau giữa wait() và await() từ CountDownLatch là gì?

Cảm ơn!

EDIT: Tôi đoán tôi cần phải nói lại câu hỏi của tôi:

chờ đợi() theo các tài liệu nói:

Nguyên nhân xử lí hiện tại để chờ cho đến khi chốt đã đếm xuống không , trừ khi chuỗi bị gián đoạn.

Đối với tôi, khó có thể thấy sự khác biệt giữa wait() và await() - await() thực sự đang chờ wait() và có vẻ như có thông báo ngầm() khi đếm đến 0.

Điều tôi muốn hỏi là, tại sao tôi không nên sử dụng cơ chế wait-notifyAll() (với xử lý biến số lượt truy cập của riêng tôi), thay vì dùng CountDownLatch?

+1

Dưới đây là một sự khác biệt rõ ràng ... nếu chuỗi B gọi 'notifyAll()' trước khi chuỗi A gọi 'wait()', luồng A sẽ chờ mãi mãi; nhưng nếu thread B gọi 'countDown()' trước khi thread A gọi 'await()', luồng A sẽ tiếp tục mà không cần chờ đợi. – yshavit

Trả lời

9

Chúng chắc chắn không làm điều tương tự: CountDownLatch chỉ các tín hiệu khi số sự kiện đã đạt đến 0 và tự động thực hiện, wait-notify yêu cầu bạn giữ số của riêng bạn nếu bạn muốn đạt được hành vi tương tự. Việc thực hiện cùng một hành vi thường dễ xảy ra lỗi và tốt nhất là bạn nên tránh nó (đặc biệt nếu bạn là người mới lập trình đồng thời). So sánh CountDownLatchwait-notify hầu như không phải là một quả táo để so sánh cam, nó giống như so sánh một mũi khoan tự động và cờ lê Allen.

Tôi không biết nếu bạn đã sử dụng notifyAll()CountDownLatch, nhưng chỉ notifyAll() sẽ không cung cấp cho bạn hành vi tương tự trừ khi bạn đã đếm số lượng sự kiện đã xảy ra. CountDownLatch có lẽ phù hợp nhất để thực hiện một số công việc cố định và chờ đợi các tác vụ đó hoàn thành trước khi bạn tiếp tục thực hiện phần còn lại của chương trình. Điều này đặc biệt hữu ích khi bạn có một số chuỗi cố định (ví dụ: ThreadPool) thực hiện một số tác vụ cố định, nhưng chuỗi của bạn ít hơn so với các tác vụ và bạn phải sử dụng lại chúng. Với CountDownLatch bạn có thể dễ dàng chờ đợi cho tất cả các tác vụ được hoàn thành. Tôi không biết làm thế nào bạn đã sử dụng notifyAll() để đạt được hành vi tương tự, nhưng nếu bạn cung cấp thêm thông tin, chúng tôi có thể giải quyết một trong hai lựa chọn nào tốt hơn (chắc chắn có một số trường hợp là waitNotify() phù hợp hơn) .

Về sự khác biệt giữa wait()await(), tôi hơi thất vọng với bạn! Nhìn lên các tài liệu là bước một trong bất kỳ câu hỏi:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

await() là một chức năng thực tế của CountDownLatch trong khi wait() được thừa hưởng từ Object. Tôi khuyên bạn nên kiểm tra tài liệu cho những gì họ làm.

+0

Có lẽ bạn nên đăng tài liệu hiện tại –

+0

@HunterMcMillen ah, vâng ... đó là một ý tưởng hay:) ... (cập nhật tài liệu) – Kiril

+0

Ý của bạn là "ThreadPool thực hiện một số nhiệm vụ cố định, nhưng chuỗi của bạn ít hơn hơn các nhiệm vụ và bạn phải sử dụng lại chúng ", làm thế nào để thực hiện n luồng làm nhiệm vụ m (n coderz