Am I right in thinking, that if the method only does one line like the above, then there is no point in it being synchronized.
不,你似乎相信同步只意味着原子性.
但它确实提供了更多 – 特别是,它保证:
>原子性,对一行分配无用(下面的边框除外)
>能见度
>防止重新排序
>互斥:在同一台监视器上同步的2个方法不能同时运行
在您的示例中,如果没有synchronized,则无法保证如果某个线程调用您的方法而另一个线程随后读取余额,则该第二个线程将看到更新的值.
请注意,必须在两端确保可见性:写入和读取需要与同一监视器同步.所以getter getBalance也需要syhcnronized.
边框情况:double and long assignements are not guaranteed to be atomic.所以即使在如下所示的单行示例中,如果没有synchronized关键字,一个线程可能会更新double的前32位而另一个线程会更新最后32位,从而创建一个新的混合余额变量.
public synchronized void setValue(double value) {
balance = value;
}