在运行方法内使用同步块有意义吗?我认为它确实如此,只要我使用相关的锁,而不是包含此运行方法的Runnable实例。在stackoverflow上阅读类似问题的答案似乎证实了这一点。我试着写一些简单的代码进行测试和运行方法内同步块不从数据损坏预防:运行方法内的同步块
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);
}
}
为什么这个代码产生不正确的结果?这是因为同步块还是其他一些错误?我觉得我在这里错过了一些基本的东西。
你正在做的一切正确,[它正常工作](http://ideone.com/XdaXCm)。 – dasblinkenlight 2013-04-24 01:01:31
我想你可能会受到Java内存模型的影响。 – 2013-04-24 01:04:17
你正在使用哪种JRE? – 2013-04-24 01:06:39