Câu trả lời:
Tôi đã viết câu trả lời này xuống vì tôi nghĩ rằng đây sẽ là một sự tương tự thú vị (và phù hợp):
Hãy nghĩ về một vật có thể khóa như một bảng đen (có thể khóa) trong phòng học có một giáo viên (nhà văn) và nhiều học sinh (độc giả).
Trong khi một giáo viên đang viết một cái gì đó (khóa độc quyền) trên bảng:
Không ai có thể đọc nó, bởi vì nó vẫn đang được viết và cô ấy chặn tầm nhìn của bạn => Nếu một đối tượng bị khóa riêng, không thể lấy được khóa chung .
Các giáo viên khác sẽ không đến và bắt đầu viết, hoặc bảng không thể đọc được và khiến học sinh bối rối => Nếu một đối tượng bị khóa độc quyền, không thể có được các khóa độc quyền khác .
Khi học sinh đang đọc (khóa chung) những gì trên bảng:
Tất cả đều có thể đọc những gì trên đó, cùng nhau => Nhiều khóa được chia sẻ có thể cùng tồn tại .
Giáo viên đợi họ đọc xong trước khi cô xóa bảng để viết thêm => Nếu một hoặc nhiều khóa chia sẻ đã tồn tại, không thể lấy được khóa độc quyền .
lock()
cuộc gọi tiếp theo sau người đầu tiên sẽ trở lại ngay lập tức và thành công. tức là bạn có thể khóa thành công một cái gì đó bạn đã sở hữu.
writer
được ưu tiên hơn so với các độc giả đang chờ khi khóa chọn ai sẽ lấy khóa tiếp theo (khi chủ sở hữu hiện tại của nó mở khóa). Đây là về chính sách .
Nó khá đơn giản. Khóa đọc còn được gọi là khóa chia sẻ vì nhiều hơn một quá trình có thể đọc cùng một lúc. Điểm quan trọng của khóa đọc là ngăn chặn việc mua lại khóa ghi bằng quy trình khác. Ngược lại, khóa ghi ức chế tất cả các hoạt động khác trong khi thao tác ghi hoàn thành, đó là lý do tại sao nó được mô tả là độc quyền.
Vì vậy, khóa đọc cho biết "bạn có thể đọc ngay bây giờ nhưng nếu bạn muốn viết bạn sẽ phải chờ" trong khi đó khóa ghi "bạn sẽ phải chờ".
Tôi nhận ra bạn đang nghiên cứu để hỗ trợ cho việc học của bạn, nhưng tôi không thể cưỡng lại sự thôi thúc giảng bài.
Việc sử dụng khóa không đầy đủ là nguyên nhân chính gây ra đau đầu về hiệu suất. Sử dụng một hệ thống khóa phân biệt các khóa đọc và ghi là một khởi đầu tốt, nhưng thiết kế cẩn thận đôi khi có thể loại bỏ phần lớn nhu cầu khóa. Ví dụ, trạng thái phiên không bao giờ được giữ trong một bộ sưu tập toàn cầu cho mỗi phần tử trạng thái.
Tôi đã thực sự thấy điều này được thực hiện. Đó là một thiết kế tàn bạo, gây ra quyền anh và thay đổi bộ sưu tập cho mỗi lần thay đổi cuối cùng sang trạng thái phiên, kéo theo khóa viết kéo dài. Các chi phí đã bị tê liệt, làm giảm hiệu quả máy chủ thành hành vi đơn luồng.
Đơn giản chỉ cần tổng hợp tất cả trạng thái phiên thành một cấu trúc là một cải tiến lớn. Thay đổi trạng thái phiên chỉ thay đổi giá trị của các thành viên trong cấu trúc trạng thái của phiên. Vì không có phiên nào khác có cơ hội hoặc thậm chí có cơ hội tham chiếu trực tiếp trạng thái của phiên, nên bộ sưu tập duy nhất được cập nhật là danh sách các phiên. Kết quả là, khóa là hoàn toàn không cần thiết trong một lần sesssion, chỉ khi bắt đầu và kết thúc, và thông lượng tăng lên theo hệ số 3000.
Kịch bản khóa phổ biến khác là các tài nguyên được chia sẻ giữa các luồng của ứng dụng người dùng. Hầu hết các khung hiện đại giải quyết vấn đề này bằng cách sử dụng tin nhắn thay vì khóa; khi bạn "chuyển sang luồng UI", bạn thực sự đang xếp hàng một tin nhắn có chứa một con trỏ hàm và một số tham số (hoặc một ủy nhiệm và khung ngăn xếp tùy theo việc thực hiện).
Khóa độc quyền hoặc ghi cho phép truy cập độc quyền quá trình để ghi vào phần được chỉ định của tệp. Trong khi khóa ghi được đặt đúng chỗ, không có quá trình nào khác có thể khóa phần đó của tệp.
Khóa chia sẻ hoặc đọc sẽ cấm mọi quá trình khác yêu cầu khóa ghi trên phần được chỉ định của tệp. Tuy nhiên, các quy trình khác có thể yêu cầu đọc khóa.
Thêm về điều đó: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html
Nguyên tắc tương tự về phía cơ sở dữ liệu là tốt. Theo tài liệu của Oracle
Chế độ khóa độc quyền ngăn chặn tài nguyên liên quan được chia sẻ. Chế độ khóa này được lấy để sửa đổi dữ liệu. Giao dịch đầu tiên để khóa tài nguyên độc quyền là giao dịch duy nhất có thể thay đổi tài nguyên cho đến khi khóa độc quyền được phát hành.
Chế độ khóa chia sẻ cho phép chia sẻ tài nguyên liên quan, tùy thuộc vào các hoạt động liên quan. Nhiều người dùng đọc dữ liệu có thể chia sẻ dữ liệu, giữ khóa chia sẻ để ngăn người truy cập truy cập đồng thời (người cần khóa độc quyền). Một số giao dịch có thể có
được khóa chia sẻ trên cùng một tài nguyên.