В Java, имеет ли значение возвращать значение в синхронизированном блоке?

Код как ниже

public class UAUtil {
private static String sUA = null;
private static Object sLock = new Object();
public static void clear() {
    synchronized (sLock) {
        sUA = null;
    }
}
public static String getUserAgent() {
    synchronized (sLock) {
        if (sUA == null) {
            Context context = CoreService.getAppContext();
            sUA = ...;
        }
    }

    return sUA;
}

Поэтому мне интересно, имеет ли значение возвращать sUA внутри или из синхронизированного блока?

2 ответа

Никто не может сказать вам правильный ответ, потому что код выглядит неполным.

Тем не менее, учитывая код, который вы опубликовали, почему sUA переменная экземпляра?

Зачем даже держать это как государство. Лучше всего, если вам не нужно это состояние, это return <whatever code is setting sUA>,

Если есть код, который вы не показываете, который использует это состояние, то просьба показать его и...

Также private static Object sLock = new Object(); не является правильным способом использовать ссылку на объект syncrhonize на. Должно быть объявлено final правильно гарантировать семантику.

Лучше было бы сделать sUA замок. Вместо того, чтобы использовать null использовать NullObjectPattern и иметь значение, которое представляет все, что вы используете null означать.

Используя private static final AtomicReference со значением, таким как "" или какое-либо другое нулевое значение для представления не установлено, вы можете использовать что-то для synchronize и удерживайте значение одновременно. Создание более правильного и чистого кода, который будет легче поддерживать.

Поэтому мне интересно, имеет ли значение возвращать sUA внутри или из синхронизированного блока?

нет, это не имеет значения, если вы return за пределами synchronized заблокировать это будет абсолютно нормально, а также если его в пределах synchronized заблокировать lock будет выпущен правильно, поэтому нет вреда.

Вот хорошая ССЫЛКА на ответы Джона Скита и Марка Байерса на аналогичный вопрос.

Другие вопросы по тегам