Я читал, что следующий класс не является потокобезопасным, так как потоки могут читать несогласованные данные, так как есть вероятность, что поток прочитает масштабированную версию real
и немасштабированную версию imaginary
. Но я не понимал, как это сделать.Java: безопасность потоков в классе с синхронизированными методами
Я был под впечатлением, что если поток получает блокировку и в scale()
метод, никакой другой поток не может быть в getReal()
или getImaginary()
методов в то же время, так что другие потоки не могут читать «половину масштабируется» комплексных чисел. Это не правильно?
class Complex
{
double real;
double imaginary;
synchronized void scale(double scaleFactor)
{
real = real * scaleFactor;
imaginary = imaginary * scaleFactor;
}
synchronized double getReal()
{
return real;
}
synchronized double getImaginary()
{
return imaginary;
}
}
На всякий случай, это не очевидно из вашего ответа, я бы добавил, что синхронизированные ключевые слова должны быть удалены, поскольку неизменяемость устраняет необходимость в блокировках. – alpian