Это не поточно-безопасный. Переменные типа long
и double
в Java рассматриваются как две отдельные 32-битные переменные. Один поток может записывать и писать половину значения, когда другой поток читает обе половины. В этой ситуации читатель увидит ценность, которая никогда не должна существовать.
Чтобы сделать это поточно-вы можете либо объявить myVar
как volatile
(Java 1.5 или более поздней версии) или сделать как setIt
и getIt
synchronized
.
Обратите внимание, что даже если myVar
был 32-разрядным int
, вы все равно можете столкнуться с проблемами потоков, когда один поток может считывать устаревшее значение, измененное другим потоком. Это может произойти из-за того, что ЦП было кэшировано. Чтобы решить эту проблему, вам снова нужно объявить myVar
как volatile
(Java 1.5 или новее) или сделать как setIt
, так и getIt
synchronized
.
Следует также отметить, что если вы используете результат getIt
в следующем вызове setIt
, например. x.setIt(x.getIt() * 2)
, то вы, вероятно, хотите synchronize
через оба позывных:
synchronized(x)
{
x.setIt(x.getIt() * 2);
}
Без дополнительной синхронизации, другой поток может изменить значение в период между getIt
и setIt
вызовов вызывает значение другого потока, чтобы быть потеряны.
Это домашнее задание? Или вопрос с интервью? – finnw
@finnw: Всякий раз, когда вы предпочитаете :) В чем разница ...? если вы не внесли свой вклад ...? Вы хотите, чтобы я менял теги? –
Мне было просто любопытно, потому что меня задали аналогичный вопрос на собеседовании. Нет необходимости менять теги. – finnw