【问题标题】:Why Locks are Serializable in java?为什么锁在java中是可序列化的?
【发布时间】:2013-08-01 11:42:34
【问题描述】:

在研究 ReentrantLock 类的实现时,我想到了一个问题。 ReentrantLock 是可序列化的,并且在文档中它说任何反序列化的锁始终处于解锁状态,而与序列化时的状态无关。这是有道理的,因为状态 Lock 和 unlock 基本上基于运行时的线程(持有锁),而我们反序列化时这些线程可能不可用。

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

希望我清楚地说明我对 Java 中的锁序列化的困惑。

【问题讨论】:

    标签: serialization deserialization


    【解决方案1】:

    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 页面上看到的所有其他内容。

    【讨论】:

    • 如果是这种情况,可以将锁声明为瞬态,并且在反序列化之后,您必须再次锁定临界区。
    • @Gourabp 这是一个很好的观点。我的意思是,你仍然可以这样做,不是吗?我认为他们这样做只是为了通过序列化“安全”。但除此之外,我想我真的不太确定他们为什么会这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2014-09-12
    • 2014-03-29
    • 2013-05-26
    • 2016-02-15
    • 2011-01-15
    • 2010-10-11
    相关资源
    最近更新 更多