gpt4 book ai didi

java - 用作锁的 transient 最终字段为空

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:50 27 4
gpt4 key购买 nike

以下代码抛出一个NullPointerException

import java.io.*;

public class NullFinalTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
Foo foo = new Foo();
foo.useLock();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
new ObjectOutputStream(buffer).writeObject(foo);
foo = (Foo) new ObjectInputStream(new ByteArrayInputStream(buffer.toByteArray())).readObject();
foo.useLock();
}

public static class Foo implements Serializable {
private final String lockUsed = "lock used";
private transient final Object lock = new Object();
public void useLock() {
System.out.println("About to synchronize");
synchronized (lock) { // <- NullPointerException here on 2nd call
System.out.println(lockUsed);
}
}
}
}

这是输出:

About to synchronize
lock used
About to synchronize
Exception in thread "main" java.lang.NullPointerException
at NullFinalTest$Foo.useLock(NullFinalTest.java:18)
at NullFinalTest.main(NullFinalTest.java:10)

lock 怎么可能为空?

最佳答案

用作锁的 transient 最终字段为空

以下是关于 transient 变量的一些事实:

- Transient 关键字在实例变量上使用时,将阻止该实例变量被序列化。

- 在反序列化时, transient 变量获得它们的默认值......

例如:

  • 对象引用变量为 null
  • int 到 0
  • boolean 值到false,等......

这就是反序列化时出现 NullPointerException 的原因...

关于java - 用作锁的 transient 最终字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12324472/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com