không giúp ích gì cho chính nó. Trong cấu trúc dữ liệu không khóa, cần phải có một trường hợp nguyên tử duy nhất khi cấu trúc dữ liệu của bạn thay đổi. Tất cả cácbất biến đại diệncần phải có hiệu lực cả ngay trước và ngay sau nguyên tử đó.Ô ( 1 )
Điều này có nghĩa là nếu bạn đang thực hiện sửa đổi cấu trúc dữ liệu, đặc điểm quan trọng là bạn có thể thực hiện tất cả các mod trên cấu trúc dữ liệu riêng tư và sau đó trao đổi trong các sửa đổi trong một lệnh nguyên tử.
Khóa tự do thường dễ nhất khi cấu trúc dữ liệu của bạn là bất biến ( hoàn toàn là chức năng ). Bạn chỉ cần giữ một con trỏ chung cho phiên bản hiện tại của cấu trúc dữ liệu. Độc giả không cần phải khóa bất cứ điều gì. Sửa đổi cấu trúc dữ liệu được thực hiện bằng cách hoán đổi con trỏ toàn cầu sang cấu trúc dữ liệu bất biến này sang cấu trúc dữ liệu bất biến khác.
Ví dụ: nếu bạn có một cây cân bằng hoàn toàn chức năng, bạn:
- Ghi con trỏ toàn cầu hiện tại vào gốc của cây.
- Tạo một cây mới chèn hoặc xóa một nút. (Đây là logarit về thời gian và không gian trong số lượng nút hiện có trong cây và liên quan đến việc tạo các nút mới từ điểm sửa đổi cho đến gốc và chỉ trỏ mọi thứ mới vào các phần cũ của phiên bản trước của cấu trúc dữ liệu. )
- Nguyên tử so sánh và trao đổi con trỏ toàn cầu với thư mục gốc. (Lưu ý rằng điều này có thể thất bại nếu một sửa đổi khác đã xảy ra giữa thời điểm bạn ghi lại con trỏ gốc cũ và bây giờ. Nếu điều này xảy ra, bạn quay lại bước 1 và thử lại. Đây được gọi là "điều khiển đồng thời lạc quan.")
Lưu ý rằng phần quan trọng nhất là những gì tôi đã nói ở trên về việc cần duy trì bất biến đại diện. Nó thường không đủ để có một thuật toán mà nguyên tử tạo ra một sự thay đổi ở giữa cây. Tại sao? Ví dụ: bạn có thể có một luồng người đọc đang trong quá trình thực hiện một giao dịch đặt hàng trước của cây. Nếu bạn sửa đổi một nút là tổ tiên của nút mà họ hiện đang đọc thì bạn sẽ vô hiệu hóa các điều kiện tiên quyết mà họ nghĩ rằng họ đã thực thi. Người đọc cần có khả năng làm việc với cấu trúc dữ liệu chính xác như trước khi bạn thực hiện thay đổi hoặc chính xác như sau khi bạn thực hiện thay đổi. Không phải cái gì ở giữa.
O ( l o g( N) )Ô ( N)