В 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
будет выпущен правильно, поэтому нет вреда.
Вот хорошая ССЫЛКА на ответы Джона Скита и Марка Байерса на аналогичный вопрос.