java - 在空对象上使用 Synchronized 时出现 NullPointerException

标签 java

我看过这个NullPointerException on synchronized statement .

代码:

synchronized(a){
    a = new A()
}

所以根据上面的答案我知道不可能在空引用上使用synchronized关键字

所以我将代码更改为:

synchronized(a = new A()){}

但不确定这是否与我的原始代码相同?

更新:

我想要实现的是锁定a的创建(a = new A())

最佳答案

同步需要一个提供锁定机制的对象。可以是任何对象(事实上,不带参数的synchronized会在this上同步),但Java API提供了专门用于此功能的类,例如ReentrantLock .

在代码中,您提供的对包含同步块(synchronized block)的函数的每次调用都将使用不同的对象进行锁定,从而有效地使同步变得无用。

编辑: 既然您用您实际想要完成的任务更新了您的帖子,我可以为您提供更多帮助。

public class Creator {
    private A a;

    public void createA() {
        synchronized(this) {
            a = new A();
        }
    }
}

我不知道这是否适合您的设计,因为您提供的代码示例非常小,但您应该明白。这里 Creator 类的实例用于同步 A 的创建。如果您在多个线程之间共享它,每个线程都调用 createA(),您可以确保一个实例化过程将在另一个实例化过程开始之前完成。

关于java - 在空对象上使用 Synchronized 时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30931336/

相关文章:

java - Android SQLite CustomAdapter 和自定义 ListView

Java Swing, JComboBox 下拉列表点击前改变监听器

java - 与 MongoDB 和 Java 8 一起使用的 Play-Framework 2.4.x

java - 在android中不使用onclicklistener访问 ListView 项目

java - 如何设置 NetBeans 项目属性以使用 Java 7?

java - 我们可以在 Twilio 的电话 session 中调用号码吗?

java - Spring 数据 : How to lock a row in a transaction and make other transactions wait until it is released?

java - 如何在 lucene 中索引 pdf、ppt、xl 文件(基于 java 或 python 或 php 的任何一个都可以)?

java - 在扩展类上声明proporder

java - 如何在 Ant WAR 任务中包含配置文件?