为什么Locks在java中是可序列化的?

Gou*_*abp 8 serialization deserialization

在研究ReentrantLock类的实现时,我脑海中浮现出一个问题.ReentrantLock是可序列化的,并且在文档中它表示任何反序列化的锁总是被解锁,而不管序列化时的状态如何.这是有道理的,因为状态Lock和unlock基本上是基于运行时的线程(持有锁),而我们反序列化这些线程可能不可用.

问题是:为什么我们需要Lock来保持,因为它不存储它的基本状态(锁定/解锁)?现在我可以假设可能是锁的公平性.但公平性又取决于底层操作系统,所以如果我们坚持锁定在一个平台上并在另一个平台上反序列化,因为(写一次并在任何地方运行)它可能不起作用所以没有必要坚持只是为了公平.

希望我清楚地对java中的Lock序列化感到困惑.

Ric*_*ner 6

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不可序列化,那么依赖于它的任何东西也都无法序列化.

您还可以存储所有者,holdCount,queuedThreads以及您在上面为ReentrantLock链接的API页面上看到的所有其他内容.

  • 如果是这种情况,锁可以被声明为瞬态,并且在解除序列化之后无论如何您都必须再次锁定关键部分。 (3认同)