反序列化后锁定的状态是什么

时间:2012-03-21 11:38:15

标签: java serialization

给出以下代码:

import java.io.Serializable;
import java.util.concurrent.locks.ReentrantLock;

class Data
{
    private int value;

    Data (int value)
    {
        this.value = value;
    }
}

public class InfoCollection implements Serializable
{
    private Data[] data;
    private static final long serialVersionUID = 1L;
    private transient ReentrantLock _lock = new ReentrantLock ();

    public InfoCollection (int datasize)
    {
        this.data = new Data[datasize];
    }

    public setData (Data newdata, int index)
    {
        _lock.lock ();

        try
        {
            this.data[index] = newdata;
        }
        finally
        {
            _lock.unlock ();
        }
    }
}

假设我创建了一个InfoCollection类型的对象并将其序列化。过了一会儿我反序列化并想要使用它。反序列化后,_lock字段将处于什么状态?锁定还是解锁? null还是not null?为什么?

通过实际操作并检查锁的状态可以很容易地找到它,但我想在逻辑上弄明白。

我认为,在反序列化之后,类/对象的加载将触发对ReentrantLock的构造函数的调用(因为构造函数在任何方法/构造函数之外被调用),这将给你结果解锁的对象。我是对的吗?

2 个答案:

答案 0 :(得分:2)

JDK 1.5中ReentrantLock的Javadoc明确指出:

 *
 * <p>Serialization of this class behaves in the same way as built-in
 * locks: a deserialized lock is in the unlocked state, regardless of
 * its state when serialized.

答案 1 :(得分:1)

在您的示例中,lock将为null。

_lock - 在瞬态 - 它没有存储 - 所以它不会被恢复。不会调用构造函数

私人瞬态 ReentrantLock _lock = new ReentrantLock();

注意

数据不可序列化,您没有实施方法:

 private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;