java同步方法-它是如何工作的
我想我知道这一点,但我想确认一下 显然,synchronized阻止了其他线程访问它,但是我看到了很多例子,比如java同步方法-它是如何工作的,java,synchronized,Java,Synchronized,我想我知道这一点,但我想确认一下 显然,synchronized阻止了其他线程访问它,但是我看到了很多例子,比如 public synchronized void setValue(int value) { balance=value; } 我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了 感谢它不仅阻止其他线程访问此方法:它还阻止其他线程访问具有相同锁(此处为实例)的任何块或方法 关键是,如果另一个同步方法的时间更长,您可以放心,这个方法不会
public synchronized void setValue(int value)
{
balance=value;
}
我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了
感谢它不仅阻止其他线程访问此方法:它还阻止其他线程访问具有相同锁(此处为实例)的任何块或方法 关键是,如果另一个同步方法的时间更长,您可以放心,这个方法不会同时运行 如果另一种方法依赖于
余额
变量,且该变量在执行过程中没有变化,则这一点非常重要
我的想法是对的,如果这个方法只执行上面的一行,那么同步就没有意义了
不,你似乎认为同步只意味着原子性
但它实际上提供的不止这些——特别是,它保证:
- 原子性,这对于单行分配不有用(以下边界情况除外)
- 可见度
- 防止重新排序
- 互斥:同一监视器上同步的2个方法不能同时运行
balance
,那么第二个线程将看到更新的值
注意,必须确保两端的可见性:写入和读取需要在同一个监视器上同步。因此gettergetBalance
也需要同步
边界案例:。因此,即使在下面这样的单行示例中,如果没有synchronized关键字,也有可能一个线程更新double的前32位,另一个线程更新最后32位,从而创建一个新的混合平衡变量
public synchronized void setValue(double value) {
balance = value;
}
多个线程可以使用不同的值调用setValue方法。所以,若您确实希望确保一个线程的更改对另一个线程可见,那个么应该同步该方法 同步方法有两个作用:
- 不允许超过1个线程执行该方法
- 将线程内存缓存与共享内存同步
balance
中看到最新数据
如果没有同步,其他线程将使用(很可能)他们缓存的balance
值,因此在程序执行后,您将得到不一致的balance
值
你可以从中找到问题的很好的解释。但是“读取”方法也必须同步才能实现。如果你只获得或设置
平衡,你可以使其波动但你不能原子地获得和设置。好的,我想我明白了。因此它会锁定类中所有同步的方法。@MatthewSmith不完全是这样:它会锁定从中调用此方法的对象的实例。但由于锁是协作的,所以访问此值的其他方法也必须同步。