java – 用作锁的瞬态final字段为null
发布时间:2020-12-14 23:34:40 所属栏目:Java 来源:网络整理
导读:以下代码抛出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 ByteA
以下代码抛出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) 如何锁定可能为空? 解决方法
用作锁的瞬态最终字段为空
以下是关于瞬态变量的一些事实: – 在实例变量上使用Transient关键字时,将阻止该实例变量被序列化. – 在反序列化时,瞬态变量达到其默认值….. 例如: > Object Reference变量为null 这就是你在反序列化时获得NullPointerException的原因…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |