Это не потокобезопасно. Переменные типа 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
, что приведет к потере значения другого потока.