线程安篇 - 为什么使用 Synchronize 仍然无法保证安全性?

看看这段代码,为什么方法全部使用了 synchronize 关键字, 却无法保证线程安全性?问题的关键不在于代码本身, 而是代码逻辑出了问题…

class Location {
   private double x_, y_;

   synchronized double x() { return x_; }
   synchronized double y() { return y_; }

   synchronized void moveBy(double dx, double dy) {
      x_ += dx; y_ += dy;
   }
}

试图分析如果出现下面这种交织情况:

  1. Thread1: x=loc.x(); … …; y=loc.y();
  2. Thread2: … …; loc.moveBy(1,6);… …;
    当线程1获取 x 值后, 线程2却修改了 x, y 的值,随后线程1又获取 y 的值。这将导致线程1获取的数据出现不一致现象:(old x, new y)。

本该获取最新的一组数据 x, y,却导致 x 读取到了旧值,而 y 却是最新值。

如何避免这种问题?将在以下链接中详细进行介绍:javacornicon-default.png?t=M276http://javacorn.com/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值