2013-06-04 17 views
18

Trong khi đọc đồng thời trong Java, tôi đã sau:nghi ngờ đồng bộ Vs Semaphore

  1. Liệu Java cung cấp xây dựng cấp dưới sau đó đồng bộ để đồng bộ hóa?

  2. Trong hoàn cảnh nào, chúng tôi sẽ sử dụng semaphore qua đồng bộ (trong đó cung cấp hành vi màn hình trong Java)

+0

tôi nghĩ cho câu 1, chúng ta có thể sử dụng các đối tượng ReentrantLock và Condition, chúng là loại cấu trúc mức thấp hơn. – Addict

Trả lời

34

đồng bộ cho phép chỉ một sợi thực hiện để truy cập tài nguyên cùng một lúc. Semaphore cho phép tối đa n (bạn có thể chọn n) luồng thực thi để truy cập tài nguyên cùng một lúc.

8
  1. Ngoài ra còn có volatile từ khóa, theo http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.htmlvolatile truy cập biến là hiệu quả hơn so với việc tiếp cận các biến thông qua mã đồng bộ

  2. java.util.concurrent.Semaphore được sử dụng để hạn chế số lượng bài có thể truy cập vào một tài nguyên. Tức là, trong khi synchronized chỉ cho phép một luồng để khóa và thực thi khối/phương thức được đồng bộ hóa, Semaphore cho phép tối đa n luồng đi và chặn các luồng khác.

+0

đồng bộ cung cấp giải pháp cho cả nhiễu Thread và lỗi nhất quán bộ nhớ, tuy nhiên chỉ dễ bay hơi cung cấp giải pháp cho lỗi nhất quán bộ nhớ, vì vậy chúng tôi không thể sử dụng dễ bay hơi để cung cấp nguyên tử trong hoạt động. – Addict

+0

dễ bay hơi cũng cung cấp truy cập nguyên tử để dài/đôi –

+0

Với dễ bay hơi, bạn vẫn có thể đọc bẩn và làm hỏng giá trị được chia sẻ của mình. Vì vậy, nó không phải là một thay thế cho đồng bộ. –

2

Ngoài ra còn có atomics. Điều này cho phép truy cập vào lệnh so sánh và trao đổi phần cứng cơ bản là cơ sở của tất cả đồng bộ hóa. Nó cho phép bạn, ví dụ, để tăng số một cách an toàn. Nếu bạn ++ một trường dễ bay hơi, một chuỗi khác thực hiện cùng một hướng dẫn có thể đọc trường trước khi chuỗi của bạn ghi vào đó, sau đó viết lại cho nó sau chuỗi của bạn. Vì vậy, một gia số bị mất. Nguyên tử làm việc đọc và viết "nguyên tử" và vì vậy tránh được vấn đề.

Trên thực tế, các chất bay hơi, báo cáo đồng bộ, Atomics có xu hướng buộc tất cả các dữ liệu chủ đề được làm mới từ bộ nhớ chính và/hoặc ghi vào bộ nhớ chính khi thích hợp, vì vậy không ai trong số họ là thực sự rằng mức độ thấp. Không giống như C#, Java không thực sự có khái niệm "bộ nhớ chính".)