2013-07-31 25 views
6

Một câu hỏi nảy sinh trong đầu tôi khi xem xét việc thực hiện lớp ReentrantLock. ReentrantLock là serializable và trong tài liệu nó nói rằng bất kỳ khóa deserialized là luôn luôn mở khóa không phân biệt của nhà nước khi nó được đăng. Điều này có ý nghĩa bởi vì nhà nước Khóa và mở khóa cơ bản dựa trên các chủ đề tại thời gian chạy (người giữ khóa) và trong khi chúng tôi de-serialize những chủ đề có thể không có sẵn.Tại sao Khóa được nối tiếp trong java?

Câu hỏi là: Tại sao chúng tôi cần Khóa vẫn tồn tại vì nó không lưu trữ trạng thái cơ bản của nó (bị khóa/mở khóa)? Ngay bây giờ tôi có thể giả định rằng có thể là tài sản công bằng của khóa. Nhưng tính công bằng lại phụ thuộc vào hệ điều hành cơ bản, vì vậy nếu chúng ta duy trì khóa trên một nền tảng và deserialized trên nền tảng khác bởi vì (viết một lần và chạy bất cứ nơi nào) nó có thể không hoạt động như vậy không có điểm trong sự bền bỉ chỉ cho sự công bằng.

Hy vọng tôi rõ ràng đã đặt nhầm lẫn về việc khóa tuần tự hóa trong java.

Trả lời

5

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html http://download.java.net/jdk7/archive/b123/docs/api/java/util/concurrent/locks/ReentrantLock.html

Tôi có thể nói rằng lý do tại sao vẫn tồn tại Khóa là để bạn có thể serialize đối tượng mà phụ thuộc vào Khóa riêng của mình. Nếu Khóa không được serializable, bất cứ điều gì phụ thuộc vào nó sẽ không thể được serialized hoặc.

Bạn cũng có thể lưu trữ chủ sở hữu, holdCount, queuedThread và tất cả các nội dung khác mà bạn có thể thấy trên trang API mà tôi đã liên kết ở trên cho ReentrantLock.

+1

Nếu trường hợp đó xảy ra, Khóa có thể được khai báo là tạm thời và sau khi khử serie, bạn sẽ phải khóa lại phần quan trọng. – Gourabp

+1

@Gourabp đó là một điểm tốt. Ý tôi là, bạn vẫn có thể làm điều đó, phải không? Tôi nghĩ rằng họ đã làm theo cách này chỉ để được "an toàn" với serialization. Nhưng ngoài ra, tôi đoán tôi thực sự không chắc chắn về lý do tại sao họ lại làm thế. –

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