java同步方法-它是如何工作的

java同步方法-它是如何工作的,java,synchronized,Java,Synchronized,我想我知道这一点,但我想确认一下 显然,synchronized阻止了其他线程访问它,但是我看到了很多例子,比如 public synchronized void setValue(int value) { balance=value; } 我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了 感谢它不仅阻止其他线程访问此方法:它还阻止其他线程访问具有相同锁(此处为实例)的任何块或方法 关键是,如果另一个同步方法的时间更长,您可以放心,这个方法不会

我想我知道这一点,但我想确认一下

显然,synchronized阻止了其他线程访问它,但是我看到了很多例子,比如

   public synchronized void setValue(int value)
   {
       balance=value;
   }
我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了


感谢

它不仅阻止其他线程访问此方法:它还阻止其他线程访问具有相同锁(此处为实例)的任何块或方法

关键是,如果另一个同步方法的时间更长,您可以放心,这个方法不会同时运行

如果另一种方法依赖于
余额
变量,且该变量在执行过程中没有变化,则这一点非常重要

我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了

不,你似乎认为同步只意味着原子性

但它实际上提供的不止这些——特别是,它保证:

  • 原子性,这对于单行分配不有用(以下边界情况除外)
  • 可见度
  • 防止重新排序
  • 互斥:同一监视器上同步的2个方法不能同时运行
在您的示例中,如果没有同步,您无法保证如果一个线程调用您的方法,而另一个线程随后读取
balance
,那么第二个线程将看到更新的值

注意,必须确保两端的可见性:写入和读取需要在同一个监视器上同步。因此getter
getBalance
也需要同步

边界案例:。因此,即使在下面这样的单行示例中,如果没有synchronized关键字,也有可能一个线程更新double的前32位,另一个线程更新最后32位,从而创建一个新的混合平衡变量

public synchronized void setValue(double value) {
    balance = value;
}

多个线程可以使用不同的值调用setValue方法。所以,若您确实希望确保一个线程的更改对另一个线程可见,那个么应该同步该方法

同步方法有两个作用:

  • 不允许超过1个线程执行该方法
  • 将线程内存缓存与共享内存同步
在您的情况下,只有一个线程能够更新该变量,并且所有其他线程都将在变量
balance
中看到最新数据

如果没有同步,其他线程将使用(很可能)他们缓存的
balance
值,因此在程序执行后,您将得到不一致的
balance


你可以从中找到问题的很好的解释。

但是“读取”方法也必须同步才能实现。如果你只获得或设置
平衡
,你可以使其波动
但你不能原子地获得和设置。好的,我想我明白了。因此它会锁定类中所有同步的方法。@MatthewSmith不完全是这样:它会锁定从中调用此方法的对象的实例。但由于锁是协作的,所以访问此值的其他方法也必须同步。