当我使用下面显示的代码时,IntelliJ IDEA在代码DecibelSample中告诉我“期望的表达”。那是什么意思,我该如何解决?

if (mDecibelSample == null) {
    synchronized (DecibelSample) { // expression expected
        if (mDecibelSample == null) {
            mDecibelSample = new DecibelSample();
        }
    }
}

最佳答案

假设DecibelSample是一个类,则这不是有效的Java代码。

像这样修改您的代码,以消除编译错误:

synchronized (DecibelSample.class) {}


您的代码将无法正常工作,因为synchronized需要锁定某些实例。在上面的修改示例中,它将使用Class实例。

您也可以将其更改为synchronized (this) {},在这种情况下,它将使用您的方法所在的类的实例作为锁。

第三种选择是定义要用作锁的任意对象,例如:

private static final Object LOCK = new Object();

...

public void foo() {
    synchronized(LOCK) {}
}


这可能是最好的方法,因为针对当前实例或类实例进行锁定有一些缺点。有关更多详细信息,请参见此SO answer

有关synchronized关键字的更多信息,可以在Java Language Specification中找到。

07-24 21:01