2013-07-24 28 views
13

Tôi đang cố gắng hiểu tính hữu ích của tài sản công bằng trong lớp học Semaphore.Cài đặt công bằng trong lớp semaphore

Cụ thể trích dẫn Javadoc đề cập rằng:

Nói chung, Cột dùng để điều khiển truy cập tài nguyên cần được khởi tạo như công bằng, để đảm bảo rằng không có chủ đề là bỏ đói ra khỏi truy cập vào một tài nguyên. Khi sử dụng các ẩn dụ cho các loại điều khiển đồng bộ hóa khác, lợi thế thông lượng của việc đặt hàng không công bằng thường lớn hơn những cân nhắc công bằng.

Ai đó có thể cung cấp ví dụ về việc bạn có thể muốn đến đây ở đâu. Tôi không thể nghĩ rằng trường hợp sử dụng truy cập tài nguyên trong quá khứ. Ngoài ra, tại sao mặc định là hành vi phi công bằng?

Cuối cùng, có bất kỳ tác động nào về hiệu suất trong việc sử dụng hành vi công bằng không?

Trả lời

21

Cấu trúc đồng thời được tích hợp sẵn của Java (synchronized, wait(), notify(), ...) không chỉ định chuỗi nào sẽ được giải phóng khi khóa được giải phóng. Việc thực hiện JVM là quyết định sử dụng thuật toán nào.

Tính công bằng cho phép bạn kiểm soát nhiều hơn: khi khóa được giải phóng, luồng có thời gian chờ lâu nhất được cấp khóa (xử lý FIFO). Nếu không có sự công bằng (và với một thuật toán rất xấu) bạn có thể có một tình huống mà một sợi luôn luôn chờ đợi cho khóa vì có một luồng liên tục của các chủ đề khác.

Nếu Semaphore được thiết lập là công bằng, có một chi phí nhỏ vì nó cần phải duy trì một hàng đợi của tất cả các chủ đề chờ đợi cho khóa. Trừ khi bạn đang viết một thông lượng cao/hiệu suất cao/ứng dụng nhiều lõi, bạn có thể sẽ không thấy sự khác biệt mặc dù!

Kịch bản nơi sự công bằng là không cần thiết

Nếu bạn có N đề người lao động giống hệt nhau, nó không quan trọng mà ta có một nhiệm vụ để thực hiện

Kịch bản nơi sự công bằng là cần thiết

Nếu bạn có hàng đợi công việc N, bạn không muốn một hàng chờ đợi mãi mãi và không bao giờ có được khóa.

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