Вопрос синхронизации Java - PullRequest
       28

Вопрос синхронизации Java

0 голосов
/ 11 февраля 2010

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

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

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

Ответы [ 6 ]

5 голосов
/ 11 февраля 2010

С Секция синхронизированного оператора в Спецификации языка Java :

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

5 голосов
/ 11 февраля 2010

Вы получаете исключение 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)
2 голосов
/ 11 февраля 2010

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

1 голос
/ 11 февраля 2010

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

1 голос
/ 11 февраля 2010

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

0 голосов
/ 11 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...