我读到以下类不是线程安全的,因为线程可以读取不一致的数据,因为线程有可能读取缩放版本real和未缩放版本的imaginary.但我不明白怎么做.
我的印象是,如果一个线程获取了一个锁并且在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;
}
}
Run Code Online (Sandbox Code Playgroud)
请考虑以下情形:
getReal()scale()getImaginary()这样,线程A确实可以获得不一致的实数和虚数值.
解决方案是要么