给出以下代码:
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
的构造函数的调用(因为构造函数在任何方法/构造函数之外被调用),这将给你结果解锁的对象。我是对的吗?
答案 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;
)