0

我正在浏览一些查看同步方面的代码片段。我相信锁定发生在对象上。在 java 的情况下,我们只有对对象的引用。Java 应该使用引用来获取对象并锁定它。

如果引用恰好为空会发生什么?我觉得这会打破。如果这要工作,那么锁定也需要在引用上发生(这让我很失望)。有人可以为我澄清这一点。

    synchronized (formatters) {
        if(formatters == null) {
            prepareCache(feedId);
        }
    }
4

6 回答 6

5

你得到一个 NullPointerException。例如:

class A {
    public static void main(String[] ss) {
        Object o = null;
        synchronized (o) {
        }
    }
}

给你:

Exception in thread "main" java.lang.NullPointerException
    at A.main(A.java:4)
于 2010-02-11T09:13:12.963 回答
5

来自Java 语言规范中的同步语句部分:

"SynchronizedStatement: synchronized ( Expression ) Block" ...否则,如果 Expression 的值为 null,则抛出 NullPointerException。”

于 2010-02-11T09:17:16.003 回答
2

根据这个论坛,以及许多其他相关链接。如果 formatters 为 null,则将抛出 NullPointerException。

于 2010-02-11T09:08:53.733 回答
1

Sssh,您不应该知道这些实际上是对对象的引用!考虑它们的呈现方式——就像一个对象——而不是它们是如何实现的。Object 类提供了一个锁,因此您的格式化程序对象将继承它。如果格式化程序恰好为空,则对其进行同步将引发 NullPointerException。

于 2010-02-11T09:15:53.743 回答
1

尽可能不要在实际使用的对象上进行同步。同步您在执行锁定的类中创建的私有最终对象。这样做的原因是其他人可能会选择同一个对象进行同步,这意味着您不知道这种锁定有什么样的副作用。

于 2010-02-11T09:31:22.573 回答
0

它行不通。您同步对象,而不是变量。当变量为空时,没有要同步的对象,因此抛出异常。

于 2010-02-11T09:34:45.577 回答