2013-08-12 24 views
5

Tôi đang phân tích trên các API đồng thời java và cố gắng hiểu tính hữu ích của các khóa đọc ghi. Các javadoc nói rằng một khối readwrite duy trì một cặp khóa, một cho đọc và khác cho các hoạt động ghi. Trong khi khóa ghi là truy cập độc quyền bởi một luồng, nhiều luồng có thể có được khóa đọc. Vì vậy, nếu trong phần đọc tất cả chúng ta đang làm là đọc các hoạt động và chúng tôi đang anyways cung cấp truy cập nhiều chủ đề, những gì là cần phải có readlock ở nơi đầu tiên? Có một kịch bản khi khóa readwrite thực sự hữu ích?Truy vấn liên quan đến khóa đọc ghi

+0

Bạn cần khóa đọc sẽ khóa khi chuỗi đang giữ khóa ghi. –

Trả lời

3

.... là những gì cần phải có readlock ở nơi đầu tiên

Trong khi đọc, bạn cần phải ngăn chặn một nhà văn có được khóa ... cho đến khi tất cả các độc giả đã kết thúc. Nhưng bạn có thể đọc một trình đọc khác để có khóa.

Trong khi viết, bạn cần ngăn người đọc lấy khóa ... cho đến khi người viết hoàn tất.

(Nói cách khác, có thể có một nhà văn, HOẶC nhiều độc giả giữ ổ khóa ... nhưng không phải cả hai.)

Theo mục đích của mô tả này, nó là hữu ích để mô tả hành vi như là hai khóa. Điều gì thực sự là dưới mui xe ... là thực hiện cụ thể.


Có trường hợp nào khi khóa ghi đè thực sự hữu ích không?

Vâng yea. Trong bất kỳ trường hợp nào bạn có thể phân biệt giữa các chuỗi yêu cầu quyền truy cập chỉ đọc được chia sẻ và những yêu cầu đọc-ghi độc quyền (hoặc chỉ ghi), khóa ReadWrite cho phép đồng thời nhiều hơn một đơn giản Lock hoặc mutex nguyên thủy.

3

Nếu bạn đang đọc dữ liệu trong nhiều chủ đề, bạn có thể không thấy các thay đổi mới nhất đối với dữ liệu do sự cố về hiển thị. Có rất nhiều lớp nơi dữ liệu có thể được lưu trữ trên cơ sở từng luồng: các lớp bộ đệm CPU, bộ đệm truy cập bộ nhớ RAM và các thứ khác. Bạn có thể chắc chắn rằng bạn đã đọc khóa ở nơi bạn có thể chắc chắn rằng bạn luôn quan sát trạng thái mới nhất.

Ghi khóa thậm chí còn mạnh hơn, cung cấp khả năng truy cập nguyên tử cùng với khả năng hiển thị các thay đổi mới nhất.

Lý do chính để có loại khóa khác nhau ở đây là có khả năng nhận đủ mức đồng bộ hóa mà không giới thiệu quá nhiều chi phí và khóa cho các chủ đề khác.

Có trường hợp nào khi khóa ghi đè thực sự hữu ích không?

Nó rất hữu ích khi bạn có một số dữ liệu trong bộ nhớ (mảng, bộ sưu tập hoặc bất kỳ thứ gì), được truy vấn rất nhiều theo chủ đề khác nhau, nhưng các cập nhật của dữ liệu này xảy ra khá hiếm khi. Trong trường hợp này có khóa riêng (đọc khóa cho các truy vấn và viết khóa để cập nhật) có thể mang lại cho bạn một lợi ích đáng kể về hiệu năng.

1

Lý do để có khóa chỉ đọc là nếu một số chủ đề khác có đối tượng bị khóa để ghi, trạng thái của đối tượng đó có thể không nhất quán và do đó bạn không muốn bắt đầu đọc nó mà không có khóa nào cả. Có được một khóa đọc đảm bảo rằng (1) đối tượng ở trạng thái nhất quán trong khi bạn đang nhìn vào nó vì không có chủ đề nào khác đang sửa đổi nó và (2) không có chủ đề nào khác có thể bắt đầu sửa đổi nó cho đến khi bạn xem qua nó. Chúng tôi có khóa đọc như một loại riêng biệt bởi vì nếu nó là bình thường cho rất nhiều chủ đề để đọc nhưng có vài cập nhật, sau đó độc giả tất cả có thể được nhìn cùng một lúc.

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