看看这段代码,为什么方法全部使用了 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;
}
}
试图分析如果出现下面这种交织情况:
- Thread1: x=loc.x(); … …; y=loc.y();
- Thread2: … …; loc.moveBy(1,6);… …;
当线程1获取 x 值后, 线程2却修改了 x, y 的值,随后线程1又获取 y 的值。这将导致线程1获取的数据出现不一致现象:(old x, new y)。
本该获取最新的一组数据 x, y,却导致 x 读取到了旧值,而 y 却是最新值。
如何避免这种问题?将在以下链接中详细进行介绍:javacornhttp://javacorn.com/