2013-08-21 48 views

Trả lời

71
readLock.lock(); 

Điều này có nghĩa rằng nếu bất kỳ thread khác là viết (ví dụ: tổ chức một khóa viết) sau đó dừng lại ở đây cho đến khi không có thread khác đang viết.

Khi khóa được cấp không có chủ đề nào khác sẽ được phép viết (ví dụ: ghi khóa) cho đến khi khóa được nhả ra.


writeLock.lock(); 

Điều này có nghĩa rằng nếu bất kỳ thread khác là đọc hoặc viết, dừng lại ở đây và đợi cho đến khi không có thread khác đang đọc hoặc bằng văn bản.

Khi khóa được chấp thuận, không có chủ đề khác sẽ được phép đọc hoặc ghi (ví dụ: hãy đọc hoặc viết khóa) cho đến khi khóa được phát hành.


Kết hợp các bạn chỉ có thể sắp xếp mỗi lần một luồng để có quyền ghi nhưng nhiều người đọc như bạn có thể đọc cùng một lúc ngoại trừ khi chỉ chuỗi được viết.

Đặt một cách khác. Mỗi lần bạn muốn đọc từ cấu trúc, hãy đọc đọc khóa. Mỗi lần bạn muốn viết, hãy viết khóa. Bằng cách này bất cứ khi nào việc viết xảy ra thì không ai đọc (bạn có thể tưởng tượng bạn có quyền truy cập độc quyền), nhưng có thể có nhiều độc giả đọc cùng một lúc miễn là không có ai đang viết.

+1

+1 giải thích tốt. Chỉ cần làm rõ, bởi 'một' bạn có nghĩa là' thread'. –

15

Các tài liệu cho ReadWriteLock làm rõ điều này:

Một ReadWriteLock duy trì một cặp khóa có liên quan, một cho read-only hoạt động và một cho văn bản. Khóa đọc có thể được giữ đồng thời bởi nhiều luồng đọc, miễn là không có người viết. Khóa ghi là độc quyền.

Vì vậy, bạn có thể có nhiều độc giả cùng một lúc, nhưng chỉ có một người viết - và người viết cũng sẽ ngăn người đọc đọc. Điều này hữu ích nếu bạn có một số tài nguyên an toàn để đọc từ nhiều luồng và khi đọc phổ biến hơn nhiều so với viết, nhưng khi tài nguyên không phải là thực sự là chỉ đọc. (Nếu không có nhà văn và đọc là an toàn, không có nhu cầu cho một khóa ở tất cả.)

+1

điều gì sẽ xảy ra nếu có 100 độc giả và ở giữa 1 nhà văn muốn có khóa, vì vậy trong trường hợp này người đọc sẽ bị gián đoạn? hoặc nhà văn phải đợi cho tới khi độc giả phát hành khóa. – Vipin

+1

@Vipin: Người viết phải đợi. –

+0

Bây giờ câu trả lời của bạn là hoàn hảo :) – Vipin

6

Khi một thread có được một WriteLock, không có chủ đề khác có thể có được ReadLock lẫn WriteLock của cùng một ví dụ của ReentrantReadWriteLock, trừ khi thread đó giải phóng khóa. Tuy nhiên, nhiều chủ đề có thể có được ReadLock cùng một lúc.