Java:使用同步方法在类中进行线程安全

dev*_*ull 1 java

我读到以下类不是线程安全的,因为线程可以读取不一致的数据,因为线程有可能读取缩放版本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)

Pét*_*rök 5

请考虑以下情形:

  1. 线程A调用 getReal()
  2. 线程B调用 scale()
  3. 线程A调用 getImaginary()

这样,线程A确实可以获得不一致的实数和虚数值.

解决方案是要么

  • 创建一个公共的同步getter方法,一次返回两个值,或者
  • 正如费雯丽所说,让这个类不可变.