关于线程同步的一个问题。。

OldDreamHYN 2016-12-26 01:15:25
下面这段。。。理论上结果应该是10000啊。。但是。。
运行下来。。
不知道哪里出问题了。。



import java.util.concurrent.*;

public class Exercise30_4 {
private static Integer sum = 0;
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();

for (int i = 0; i < 10000; i++) {
executor.execute(new AddSum());
}

executor.shutdown();

while(!executor.isTerminated()) {
}

System.out.println("Sum : " + sum);
}

private static class AddSum implements Runnable {
@Override
public void run() {
synchronized(sum) {
sum += 1;
}
}
}
}


但是只要不用Integer类,比如下面这样,又没问题。。。。
是包装类有什么特殊的地方吗?

import java.util.concurrent.*;

public class Exercise30_4 {
private static Sum sum = new Sum();
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();

for (int i = 0; i < 10000; i++) {
executor.execute(new AddSum());
}

executor.shutdown();

while(!executor.isTerminated()) {
}

System.out.println("Sum : " + sum.num);
}

private static class AddSum implements Runnable {
@Override
public void run() {
synchronized(sum) {
sum.num += 1;
}
}
}

private static class Sum {
public static int num = 0;

}
}
...全文
110 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
_jant 2016-12-26
  • 打赏
  • 举报
回复
引用 3 楼 OldDreamHYN 的回复:
所以同步块自然就失效了。。。
锁要保证唯一性
OldDreamHYN 2016-12-26
  • 打赏
  • 举报
回复
所以同步块自然就失效了。。。
OldDreamHYN 2016-12-26
  • 打赏
  • 举报
回复
呃,知道了。。包装类的锅,+1之后,其实建了个新对象。
_jant 2016-12-26
  • 打赏
  • 举报
回复
使用Atomicinteger 就可以了

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧