该页面的作者提到,下面的第二个代码示例存在同步问题,但该代码在 100 次中可以运行大约 99 次。我无法看到该页面中两个程序的操作差异。
结合前两者的更通用的解决方案是将字段的值复制到局部变量中,然后仅更改局部变量。该字段在方法内保持不变。例如,
public class Counter {
int count = 0;
public void count() {
int count = this.count;
int limit = count + 100;
while (count++ != limit) System.out.println(count);
}
}
请注意局部变量 count 如何隐藏字段计数,以及 this 关键字如何用于引用阴影之外的字段计数。
当方法完成后不需要将更改的变量保存回字段时,此技巧主要有用。以下保存了状态,但仍然存在不太明显的同步问题。
public class Counter {
private int count = 0;
public void count() {
int count = this.count;
int limit = count + 100;
while (count++ != limit) System.out.println(count);
this.count = count;
}
}
事实上,这可能比原来的例子更糟糕,因为它会在 100 次中工作 99 次。如果你没有在源代码中发现它,这里的错误很难确定。