У меня возникли трудности с пониманием изменчивых переменных в Java.Нужны ли переменные волатильности для синхронного доступа?
У меня есть параметризованный класс, который содержит летучее переменную как так:
public class MyClass<T> {
private volatile T lastValue;
// ... other code ...
}
я должен реализовать некоторые основные операции против lastValue
, включающих в себя получить значение, если-не-нуль.
Нужно ли синхронизировать эти операции? Могу ли я уйти с выполнением следующего метода?
public void doSomething() {
String someString;
...
if (lastValue != null) {
someString += lastValue.toString();
}
}
Или мне нужно вставить нулевую проверку в синхронизированный блок?
public void doSomething() {
String someString;
...
synchronized(this) {
if (lastValue != null) {
someString += lastValue.toString();
}
}
}
Я знаю, что для атомарных операций, как получить и установить, я должен быть в порядке, без применения синхронизации (например. public T getValue() { return lastValue; }
). Но я не был уверен в неатомных операциях.
Переписывая 'SomeString + = lastValue.toStrin()' как 'SomeString + = ("" + LastValue);' позволяет избавиться от 'null' проверки в целом. – dasblinkenlight
@dasblinkenlight, true, но только если вы в порядке со словом «null», отображаемым в вашей результирующей строке, когда lastValue имеет значение NULL. –
@IanMcLaird Ах, вы правы, я забыл, что Java делает это (это .NET, который этого не делает). – dasblinkenlight