Sự khác biệt giữa khóa độc quyền và khóa chung là gì?


118

Theo wikipedia,

Khóa chia sẻ đôi khi được gọi là "khóa đọc" và khóa độc quyền đôi khi được gọi là "khóa ghi".

Bạn có thể giải thích lý do đằng sau các thuật ngữ "chia sẻ" và "độc quyền" không?


Là khóa không độc quyền là một tên khác của khóa chia sẻ?
Ramesh Papaganti

Câu trả lời:


417

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:

  1. 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 .

  2. 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:

  1. 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 .

  2. 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 .


2
giải thích rất tốt. Tuy nhiên, PO đã hỏi về nguồn gốc của các mệnh giá "được chia sẻ" và "độc quyền", không giải thích về nhiệt độ mỗi se.
serhio

Đây có phải là "Nếu một hoặc nhiều khóa chia sẻ đã tồn tại, khóa độc quyền không thể có được." là đúng? interms của ReentrantReadWriteLock? Tôi nghĩ khóa Viết có thể được lấy bất cứ lúc nào, nếu không thì việc bỏ đói có thể xảy ra do đọc liên tục.
Kanagavelu Sugumar

1
@KanagaveluSugumar, vâng, đó là sự thật. Bạn chỉ đơn giản là không thể có được khóa ghi khi một thực thể khác đã giữ khóa đọc trên cùng một đối tượng. Đó là toàn bộ điểm của khóa đọc-ghi. Nếu bạn tình cờ ghi đè lên một cái gì đó trong khi người khác đang đọc nó, thì họ sẽ đọc cái gì? Tôi không biết lý do tại sao bạn chọn chọn khóa đọc ghi "đăng ký lại" một cách cụ thể, nhưng việc nhập lại có nghĩa là chủ sở hữu của khóa đăng ký lại có thể 'khóa ()' lại và tất cả các 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.
ArjunShankar

2
Bạn cũng đề cập rằng "Tôi nghĩ khóa Viết có thể được lấy bất cứ lúc nào, nếu không, việc bỏ đói có thể xảy ra do đọc liên tục" - điều này đơn giản là không thể. Không thể lấy khóa ghi trong khi một số thực thể khác đã giữ khóa đọc / ghi. Điều có thể xảy ra là nếu nhiều thực thể đang chờ để khóa một đối tượng, thì việc chờ đợi 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 .
ArjunShankar

Cảm ơn bạn! Tôi đã chọn ReentrantReadWriteLock; vì đó là lớp triển khai cho ReadWriteLock trong java. Sau đó, có bất kỳ cờ nào được nâng lên hoặc được ưu tiên nhiều hơn để nói thêm các chủ đề đọc mới để chờ khi bắt đầu ghi chủ đề không? Bởi vì làm thế nào để tránh chết đói của chủ đề viết vì yêu cầu đọc liên tục?
Kanagavelu Sugumar

33

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).


6
  • 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


2

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.