多线程的demo,请问结果为什么不是1000呢?

kuaicaizhang3434 2018-03-04 06:09:39

上面是截图,菜鸟不明白问题出在哪里?请高手赐教!谢谢
下面把代码也贴出来!

public class Demo01 {
volatile static Integer i = 0;

static class ChangeThread implements Runnable {
@Override
public void run() {
increase();
}

private synchronized void increase() {
for (int ii = 0; ii < 100; ii++) {
i++;
}
}
}

public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[10];
for (int ii = 0; ii < 10; ii++) {
threads[ii] = new Thread(new ChangeThread());
threads[ii].start();
}
for (int ii = 0; ii < 10; ii++) {
threads[ii].join();
}
System.out.println(i);
}
}
...全文
271 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuaicaizhang3434 2018-03-05
  • 打赏
  • 举报
回复
引用 5 楼 baidu_27893705 的回复:
[quote=引用 4 楼 kuaicaizhang3434 的回复:]
[quote=引用 2 楼 baidu_27893705 的回复:]
不好意思,弄错图了,加上这个。

请问为啥加上这个语句Thread.sleep(100); 就能成功了呢?能再详细解释一下吗?谢谢[/quote]

线程处理太快,只能和工作内存交互,无法同步到主内存,所以你得给时间让值同步到主内存,你得看看java内存模型,就了解为什么一直得不到1000了。
总之就是给线程时间,不给时间太快的话,会导致一些问题。[/quote]
以上的回答有问题:正确的解决办法是保证i++的原子性:
kuaicaizhang3434 2018-03-04
  • 打赏
  • 举报
回复
谢谢yannsPeng,受益匪浅!
yannsPeng 2018-03-04
  • 打赏
  • 举报
回复
引用 4 楼 kuaicaizhang3434 的回复:
[quote=引用 2 楼 baidu_27893705 的回复:] 不好意思,弄错图了,加上这个。
请问为啥加上这个语句Thread.sleep(100); 就能成功了呢?能再详细解释一下吗?谢谢[/quote] 线程处理太快,只能和工作内存交互,无法同步到主内存,所以你得给时间让值同步到主内存,你得看看java内存模型,就了解为什么一直得不到1000了。 总之就是给线程时间,不给时间太快的话,会导致一些问题。
kuaicaizhang3434 2018-03-04
  • 打赏
  • 举报
回复
引用 2 楼 baidu_27893705 的回复:
不好意思,弄错图了,加上这个。
请问为啥加上这个语句Thread.sleep(100); 就能成功了呢?能再详细解释一下吗?谢谢
yannsPeng 2018-03-04
  • 打赏
  • 举报
回复
况且你volatile关键字应该不需要加的吧?加不加对你的demo不影响,都是1000
yannsPeng 2018-03-04
  • 打赏
  • 举报
回复
不好意思,弄错图了,加上这个。

62,614

社区成员

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

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