在研究ReentrantLock类的实现时,我想到了一个问题。
ReentrantLock是可序列化的,并且在文档中说,任何反序列化锁始终被解锁,而与序列化时的状态无关。这是有道理的,因为状态Lock和unlock基本上是基于运行时(持有锁的线程)的线程,并且在我们反序列化这些线程时可能不可用。
问题是:为什么我们需要Lock来保留它,因为它不存储其基本状态(锁定/解锁)?现在,我可以假定这可能是因为锁的公平性。但是公平性再次取决于底层操作系统,因此,如果我们将锁定保持在一个平台上而反序列化在另一个平台上,则是因为(一次编写并在任何地方运行)它可能无法正常工作,因此仅出于公平性考虑就没有意义。
希望我清楚地对Java中的锁序列化感到困惑。
最佳答案
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
我要说的是Lock持久存在的原因是,您可以序列化依赖Lock本身的对象。如果Lock无法序列化,则依赖于Lock的任何内容也将无法序列化。
您还可以存储所有者,holdCount,queuedThreads以及您在上面为ReentrantLock链接的API页面上看到的所有其他内容。
关于serialization - 为什么锁在Java中是可序列化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17979009/