Вопрос

Я проходил некоторые фрагменты кода, глядя на аспект синхронизации. Я считаю, что блокировка происходит на объектах. В случае Java у нас есть только ссылки на объекты. Java должна использовать ссылку, чтобы закупить объект и заблокировать его.

Что произойдет, если ссылка оказалась нулевой? Я чувствую, что это сломается. Если бы это работало, то блокировка должна произойти и на ссылках (что избивает меня). Может кто -нибудь уточнить это для меня.

    synchronized (formatters) {
        if(formatters == null) {
            prepareCache(feedId);
        }
    }
Это было полезно?

Решение

В соответствии на этот форум, и многие другие связанные ссылки. Если форматеры являются нулевыми, то NullPointerException будет брошено.

Другие советы

Вы получаете 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)

Из Синхронизированное утверждение раздел в Язычная спецификация:

"SynchronizedStatement: synchronized ( Expression ) Block"... в противном случае, если значение выражения является нулевым, выброшено NullPointerException ».

Sssh, вы не должны знать, что это на самом деле использованная литература к объектам! Подумайте о них, как они представлены - как объект - а не о том, как они реализованы. Класс объектов обеспечивает один блокировку, поэтому ваш объект Formatters унаследовал его. Если форматеры оказываются нулевыми, то синхронизация на нем будет бросить NullPointerException.

Где это возможно, не синхронизируйтесь на объектах, которые фактически используются. Синхронизируйте частные конечные объекты, которые вы создаете в классе, который делает блокировку. Причина этого заключается в том, что другие могут выбрать тот же объект для синхронизации, что означает, что вы не знаете, какие побочные эффекты имеют этот блокировка.

Это не сработает. Вы синхронизируете объекты, не на переменные. Анкет Когда переменная является нулевой, нет объекта для синхронизации, поэтому исключение брошено.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top