在 run 方法中使用同步块是否有意义?我认为确实如此,只要我使用的是相关锁,而不是包含此 run 方法的 Runnable 实例。阅读 stackoverflow 上类似问题的答案似乎证实了这一点。我尝试编写一些简单的代码来测试它,并且 run 方法中的同步块并不能防止数据损坏:
public class Test {
public Test() {
ExecutorService es = Executors.newCachedThreadPool();
for (int i = 0; i < 1000; i++) {
es.execute(new Runnable() {
@Override
public void run() {
synchronized (lock) {
sum += 1;
}
}
});
}
es.shutdown();
while(!es.isTerminated()) {
}
}
private int sum = 0;
private final Object lock = new Object();
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.sum);
}
}
为什么这段代码会产生不正确的结果?这是因为同步块还是其他错误?我觉得我在这里缺少一些基本的东西。