加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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
> int到0
> boolean to false等等…….

这就是你在反序列化时获得NullPointerException的原因……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读