2011-12-25 25 views
5

Khi câu hỏi xảy ra. Tôi đang sử dụng JDK 6.0 trên Windows 7 và tôi đang cố gắng sử dụng các ẩn dụ làm cơ chế để giải quyết vấn đề đồng bộ hóa. Nó hoạt động hoàn hảo, nhưng tôi đang cố gắng để tránh bận rộn chờ đợi trong vấn đề của tôi.Các semaphores Java có sử dụng chờ đợi bận hoặc chờ/thông báo theo mặc định không?

Tôi chỉ muốn hỏi tài liệu java và tha SO những rắc rối, nhưng các tài liệu đi như thế này:

Acquires the given number of permits from this semaphore, 
blocking until all are available, or the thread is interrupted. 

Acquires the given number of permits, if they are available, 
and returns immediately, reducing the number of available permits 
by the given amount. 

If insufficient permits are available then the current thread 
becomes disabled for thread scheduling purposes and lies dormant 

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html#acquire(int)

Đó là để nói, các tài liệu dường như ngụ ý cả câu trả lời . Cái nào đúng?

+0

hầu hết các nguyên tố 'java.util.concurrent' dựa trên' java.util.concurrent.locks.AbstractQueuedSynchronizer' dựa trên công viên/unpark, nghĩa là không có quay bận rộn – bestsss

Trả lời

0

Nó chờ đợi rõ ràng/thông báo do dòng này:

Nếu không đủ giấy phép có sẵn sau đó xử lí hiện tại trở nên tàn tật cho mục đích lập kế hoạch chủ đề và nằm im lìm.

Điều này có nghĩa là luồng không được hệ điều hành lập lịch cho đến khi sự kiện đánh thức nó (có sẵn giấy phép semaphore), tại thời điểm đó luồng được báo hiệu tiếp tục thực hiện.

+0

nó là công viên/unpark, không chờ đợi/thông báo vì có sự khác biệt giữa: chờ/thông báo yêu cầu đồng bộ hóa (hoặc tranh chấp), công viên/unpark - không. – bestsss

1

Tôi không thấy làm thế nào nó ngụ ý bận rộn chờ đợi ở tất cả. Nó nêu rõ rằng sợi chỉ là "vô hiệu hóa" và không hoạt động. Về cơ bản, nó rẻ: các chủ đề sẽ không tiêu thụ thời gian xử lý trong khi nó chờ đợi để có được semaphore.

+0

Nhưng một dòng ở trên, nó nói rằng khối chuỗi trong khi chờ đợi, điều này có vẻ mâu thuẫn. – Faqa

+1

Có. Đang chặn <> chờ đợi bận. Nếu một chủ đề gọi 'chờ' trên một semaphore với không đủ 'giấy phép', cuộc gọi không trở lại cho đến khi một sợi khác báo hiệu đủ giấy phép để đáp ứng các chủ đề chờ đợi. Nó chính xác như các bài viết của Jon Skeet ở trên - luồng này bị chặn trong suốt thời gian chờ đợi và không có CPU nào cả. Hãy thử và xem - chặn một chuỗi lặp trên một semaphore trống và kiểm tra việc sử dụng CPU - nó sẽ bằng không. –

+0

@Faqa: Như Martin nói, việc chặn không giống như bận chờ đợi. –

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