2013-07-31 32 views
6

在研究ReentrantLock類的實現時,在我的腦海中出現了一個問題。 ReentrantLock是可序列化的,並且在文檔中說任何反序列化的鎖總是被解鎖,而不管序列化時的狀態如何。這是有道理的,因爲狀態鎖定和解鎖基本上是基於運行時線程(誰持有鎖),而我們反序列化這些線程可能不可用。爲什麼鎖在java中是可序列化的?

問題是:爲什麼我們需要鎖定,因爲它不存儲它的基本狀態(鎖定/解鎖)?現在我可以假設這可能是鎖的公平屬性。但公平性仍然取決於底層操作系統,所以如果我們堅持在一個平臺上鎖定並且在另一個平臺上反序列化,因爲(寫入一次並在任何地方運行),它可能無法工作,因此沒有意義堅持公平。

希望我明確地把我的關於鎖序列化在java中的困惑。

回答

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

我想說的是,爲什麼鎖一直存在,使你能夠序列化依賴於鎖定對象本身的原因。如果鎖不是可序列化的,則任何依賴它的東西都不能被序列化。

您還可以存儲擁有者,holdCount,queuedThreads和您可以在上面鏈接到ReentrantLock的API頁面上看到的所有其他內容。

+1

如果情況是這樣的話Lock可以被聲明爲瞬態的,並且無論如何您都必須再次鎖定關鍵部分。 – Gourabp

+1

@Gourabp這是一個很好的觀點。我的意思是,你仍然可以那樣做,不是嗎?我認爲他們這樣做只是爲了在序列化時「安全」。但除此之外,我想我真的不太確定他們爲什麼會。 –

相關問題