2011-02-06 50 views
16

Theo như tôi biết, wait()notify() đã được thay thế bằng cơ chế đồng thời tốt hơn. Vì vậy, những gì thay thế tốt hơn bạn sẽ chọn, nói cho thực hiện a synchronized queue?Cách thay thế tốt nhất để chờ ... thông báo cho đồng bộ hóa ở mức độ thấp là gì?

Trong ý nghĩa nào chính xác là chúng "tốt hơn"?

Chỉnh sửa: Điều này ("triển khai hàng đợi đồng bộ") là một câu hỏi phỏng vấn. Một câu trả lời chấp nhận được không thể sử dụng BlockingQueue hoặc thực hiện hàng đợi khác. Tuy nhiên, nó có thể sử dụng các cấu trúc đồng bộ hóa khác như CountDownLatch. Tôi không có danh sách đầy đủ các lớp học được phép và bị cấm - hãy dùng đầu của bạn.

+7

Tôi sẽ không triển khai hàng đợi được đồng bộ hóa. Tôi muốn sử dụng một trong nhiều triển khai của BlockingQueue: http://download.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html –

+1

@Mike - Tôi đang chuẩn bị phỏng vấn xin việc . Trong cuộc sống thực, tôi sẽ sử dụng một cái gì đó tồn tại chứ không phải là tái tạo lại. – ripper234

+0

Sau đó, tôi sợ tôi không hiểu câu hỏi. Các khối đồng bộ và chờ/thông báo đã được thay thế bằng các trừu tượng mức cao hơn dưới dạng các lớp trong gói java.util.concurrent, không phải bởi các cấu trúc ngôn ngữ mới. Nếu mục đích của câu hỏi là sử dụng một số lớp java.util.concurrent, chúng ta sẽ loại trừ những câu trả lời nào? –

Trả lời

17

synchronized/wait()/notify()/notifyAll() đã được thay thế trực tiếp bằng phương pháp lớp Khóa lock()/unlock()/newCondition() và Điều kiện await()/signal()/signalAll().

Có một số lợi ích cho việc này, để bắt đầu cho phép các ngữ nghĩa bổ sung như chính sách công bằng, cũng như các tính năng như khóa phân phối. Sự hỗ trợ cho nhiều đối tượng Condition cho phép nhiều tín hiệu tốt hơn cũng như chờ đợi liên tục và chờ đợi cho đến khi một thời gian nào đó…

Ví dụ, mã được liên kết có các đối tượng riêng biệt mà nó cố gắng sử dụng để báo hiệu (sẽ không thành công do thực tế là các màn hình có liên quan không được giữ khi chờ). Điều này có thể thay thế trực tiếp bằng cách sử dụng một Khóa đơn với nhiều điều kiện.

Về mặt cải tiến, chức năng bổ sung có thể có giá trị. Trong Java5, việc triển khai Khóa rõ ràng thực sự hoạt động tốt hơn so với các màn hình JVM, nhưng về cơ bản chúng tôi đã đặt biệt hiệu mã của Doug Lea cho JVM và hiệu năng bây giờ là tương đương nhau.

3

Đọc nguồn của triển khai ArrayBlockingQueue cho biết việc sử dụng Conditions làm phương án thay thế cho phương pháp theo dõi đối tượng "wait/notify/notifyAll". Ngoài ra, một ReentrantLock được sử dụng thay cho từ khóa "đồng bộ hóa" để đạt được hành vi và ngữ nghĩa loại trừ lẫn nhau tương tự. Vì vậy, có vẻ như gói java.util.concurrent.locks là những gì bạn đang tìm kiếm. Các giao diện mới này tốt hơn vì chúng cung cấp chức năng bổ sung không thể với đồng bộ gốc và cấu trúc khóa, chẳng hạn như nhiều bộ chờ và các khóa đọc hoặc ghi chọn lọc (thay vì luôn đọc cả ).

Gói java.util.concurrent.atomic cũng cung cấp giao diện cho compare-and-swap hướng dẫn hữu ích cho non-blocking algorithms, có khả năng nhanh hơn nhiều so với các lựa chọn thay thế chặn của chúng nhưng có những thách thức riêng.

+0

Vui lòng xem câu hỏi đã chỉnh sửa của tôi - đây không thực sự là câu trả lời có liên quan. – ripper234

+0

Gotcha, đây là một đâm vào nó. – maerics

4

Có khá nhiều triển khai đã tồn tại trong gói java.util.concurrent. Ví dụ. - ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue.

Ngoài ra wait()notify() chưa được thay thế. Các tiện ích mới đã được giới thiệu cung cấp các chức năng bổ sung và lợi ích hiệu suất. Xem ví dụ gói java.util.concurrent.locks.

Tôi khuyên bạn nên đọc this giới thiệu. Nó cung cấp một cái nhìn tổng quan cao mà nên trả lời câu hỏi của bạn.

Chúc mừng.

Chỉnh sửa 1: Ok, sau đó, ví dụ bạn có thể sử dụng triển khai java.util.concurrent.locks .Lock để thực hiện thao tác khử thời gian mà không bị mất thời gian và đồng thời cấp độ công bằng cho chuỗi truy cập hàng đợi. Việc triển khai như vậy là ReentrantLock trong đó có một nhà xây dựng chấp nhận chính sách công bằng. Thời gian tryLock() ủng hộ đặc tính này. Ngoài ra, bạn có thể thêm một số hỗ trợ gỡ lỗi để đếm các chuỗi chờ đợi trên hàng đợi, v.v. Điều này sẽ khó thực hiện hơn chỉ với wait()notify() Tôi giả định.

Kết luận ReentrantLock là "tốt hơn" so với các đối tác cấp thấp trong khả năng mở rộng của nó. Các hành vi cơ bản là như nhau mặc dù. Nếu bạn không cần các tính năng bổ sung này wait()notify() vẫn là lựa chọn thay thế được chấp nhận.

+0

Vui lòng xem câu hỏi đã chỉnh sửa của tôi - đây không thực sự là câu trả lời có liên quan. – ripper234

+0

Ok, sau đó tôi đặt một gợi ý mẫu để sử dụng tiện ích cấp cao mới - Khóa. –

0

phương thức park() unpark() của lớp LockSupport dường như hữu ích trong trường hợp này. Tôi cũng phải đối mặt với cùng một câu hỏi và trong khi tìm kiếm trên mạng, tìm thấy một đầu mối trong cuộc thảo luận này.

Synchronization vs Lock

Nhưng tôi cần hiểu khái niệm hơn nữa để tạo ứng dụng mẫu.

0

Cách sử dụng Semaphore từ gói Đồng thời? Sử dụng một Semaphore nhị phân như là một khóa nội tại và hai đếm Semaphores để thiết lập một ràng buộc về kích thước của hàng đợi?

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